为什么这个Synchronize过程没有锁定主线程

时间:2017-08-09 12:42:10

标签: multithreading delphi delphi-xe2

我有以下代码:

TThread.Synchronize(nil,
  procedure
  begin
    with Scope.New(TManualCaptchaForm.Create(img)) do
      if It.ShowModal() = mrOk then
        res := It.edtResolved.Text;
  end
);

为什么多个TThreads使用此过程进行同步时,表单会多次出现?我知道一种解决方法,并没有什么不寻常的(例如没有其他“手工制作”方式与主线程同步),但 为什么我没有遇到锁定?

是的,Scope.New有点智能指针, 但是 只有我看到TThread.Synchronize并通过了关闭?文档说传递给TThread.Synchronize的任何方法/闭包都将在主线程内执行。显然,ShowModal必须阻止主线程,但它没有这样做。至于我,很奇怪任何其他窗口的启动都表现为主线程和泵同步队列。

P上。秒。几乎是MVP:

TThread.Synchronize(nil,
  procedure
  var Form: TForm1;
  begin
    Form := TForm1.Create(nil);
    try
      Form.ShowModal();
    finally
      Form.Free;
    end;
  end
);

在2+个线程中运行此代码并查看错误。无论如何,现在我知道同步队列由任何窗口消息循环泵送,而不仅仅是由主窗体。

Btw,我的问题是“为什么TThread.Synchronize表现得如此不清楚/不合逻辑?”,而不是我自己的代码。

0 个答案:

没有答案