我发布了一个问题,使我对多线程感到困惑,但我没有在线找到答案。假设我已经创建了类似TTest = class(TThread)
的东西,因此您可以想象我有一个 ecerute 。在里面,我可以致电:
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);
在这里,我将零用作参数,因为(如果我正确)如果我打电话给TThread.CurrentThread
,则当队列完成时,另一个由于RemoveQueudueDevents()而被删除。
所以我的真正问题是:如何确定何时必须通过nil
或TThread.CurrentThread
?
我已经理解,在派生的一类Tthread类中,就像上面的ttest一样,我可以将Queue/Sync与匿名方法称为Sync,仅是因为
Self
即将营救。如果我必须在ttask中调用队列或同步。例如,我确定我必须使用零参数吗?
我是这种事情的新手,所以我发现这很难,我想了解这个概念,否则我会创建破碎的应用程序。我看到尼克·霍奇斯(Nick Hodges)在他的书中使用了nil和CurrentThread,但我不知道为什么。
甚至在a tthread 后代 eccentute 方法中,您可以使用 synchronize and em>和 queue 在前面的 nil 参数过载。虽然同步不影响 queue 的呼叫,因此可以忽略与其他情况相同的原因,当时线程在 queue 之前结束被执行。
Synchronize(nil,
procedure
begin
//code
end);
Queue(nil,
procedure
begin
//code
end);