我发布了一个question,让我对多线程感到困惑,我没有在网上找到答案。假设我创建了类似TTest = class(TThread)
的东西,所以你可以想象我有一个执行。在里面我可以打电话:
Synchronize(procedure
begin
//code
end);
Queue(procedure
begin
//code
end);
根据我的理解,上面的代码应该在匿名方法之前有另一个隐藏参数,Self
。假设现在我不在派生类(如TTest)中,而且我处于按钮单击事件中。我可以这样称呼:
TTask.Run(
procedure
begin
TThread.Queue(nil,
procedure
begin
testB.Text := 'Please wait...';
end;
TThread.Queue(nil,
procedure
begin
testB.Text := 'Please wait MORE...';
end;
end);
这里我使用nil作为参数因为(如果我是正确的)如果我调用TThread.CurrentThread
,当Queue完成时,另一个将由于RemoveQueuedEvents()而被删除。
所以我真正的问题是:我如何确定何时必须通过nil
或TThread.CurrentThread
?
Self
来拯救。我是这类新手,所以我发现这很难,我想理解这个概念,否则我会创建破碎的应用程序。我看到Nick Hodges在他的书中使用的是nil和CurrentThread,但我无法理解为什么。
即使在TThread后代Execute方法中,您也可以使用Synchronize and Queue重载和前面的nil参数。虽然Synchronize不受影响,但可以忽略对Queue的调用,原因与在线程在执行Queue之前完成的其他情况相同。
Synchronize(nil,
procedure
begin
//code
end);
Queue(nil,
procedure
begin
//code
end);