我有以下代码:
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
表现得如此不清楚/不合逻辑?”,而不是我自己的代码。