delphi – 为什么ShowModal正在锁定Synchronize?
发布时间:2020-12-15 09:41:02 所属栏目:大数据 来源:网络整理
导读:我创建了一个通用线程类来控制一个进程表单,它在线程的构造函数中注入并设置为_progressForm.在Execute方法中,线程初始化表单并使用ShowModal()函数显示它,如下所示: procedure TProgressThread.Execute;begin ... ShowForm;end;procedure TProgressThread.
我创建了一个通用线程类来控制一个进程表单,它在线程的构造函数中注入并设置为_progressForm.在Execute方法中,线程初始化表单并使用ShowModal()函数显示它,如下所示:
procedure TProgressThread.Execute; begin ... ShowForm; end; procedure TProgressThread.ShowForm; begin if Assigned(_progressForm) then begin Synchronize( procedure begin _progressForm.ShowModal(); end); end; end; 我无法理解的是为什么我的线程被锁定在Synchronize?在关闭进度表单之前,它不会返回. ShowModal不应只锁定主线程吗? 解决方法
TThread.Synchronize()是同步的.它会阻塞调用线程,直到同步代码从主线程返回.
ShowModal()也是同步的.它会阻止调用线程,直到Form关闭. 因此,当Synchronize()在主线程中调用ShowModal()时,Synchronize()将不会返回到工作线程,直到Form关闭. 如果您不想阻止工作线程,请使用TThread.Queue()而不是TThread.Synchronize(),或使用TForm.Show()而不是TForm.ShowModal(). 显示进度不应阻止工作线程执行其工作.您应该让线程异步地将进度更新发布到主线程,并让主线程决定在线程继续工作时如何显示状态.工作者线程根本不应该知道UI. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |