gpt4 book ai didi

delphi - 为什么 Synchronize 被 ShowModal 锁定?

转载 作者:行者123 更新时间:2023-12-03 15:18:16 25 4
gpt4 key购买 nike

我创建了一个通用线程类来控制进度表单,该进度表单被注入(inject)到线程的构造函数中并设置为_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;

我不明白的是为什么我的线程被锁定在同步?在进度表关闭之前它不会返回。 ShowModal 不应该只锁定主线程吗?

最佳答案

TThread.Synchronize()同步。它会阻塞调用线程,直到同步代码从主线程返回。

ShowModal() 也是同步。它会阻塞调用线程,直到表单关闭。

所以,当Synchronize()在主线程中调用ShowModal()时,Synchronize()不会返回到工作线程,直到表格已关闭。

如果您不想阻塞工作线程,请使用 TThread.Queue() 而不是 TThread.Synchronize(),或者使用 TForm .Show() 而不是 TForm.ShowModal()

进度的显示不应阻止工作线程执行其工作。您应该让线程异步将进度更新发布到主线程,并让主线程决定如何在线程继续工作时显示状态。工作线程应该完全不了解 UI。

关于delphi - 为什么 Synchronize 被 ShowModal 锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46478462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com