我创建了一个通用线程类来控制一个进程表单,它在线程的构造函数中注入并设置为_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;
Run Code Online (Sandbox Code Playgroud)
我无法理解的是为什么我的线程被锁定在Synchronize?在关闭进度表单之前,它不会返回.ShowModal不应该只锁定主线程吗?
Rem*_*eau 12
TThread.Synchronize()是同步的.它会阻塞调用线程,直到同步代码从主线程返回.
ShowModal()也是同步的.它会阻止调用线程,直到Form关闭.
因此,当主线程中的Synchronize()调用时ShowModal(),Synchronize()在Form关闭之前不会返回到工作线程.
如果您不想阻止工作线程,请使用TThread.Queue()而不是TThread.Synchronize()使用,或者使用TForm.Show()而不是TForm.ShowModal().
显示进度不应阻止工作线程执行其工作.您应该让线程异步地将进度更新发布到主线程,并让主线程决定在线程继续其工作时如何显示状态.工作者线程根本不应该知道UI.
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |