Delphi队列和同步参数



我发布了一个问题,使我对多线程感到困惑,但我没有在线找到答案。假设我已经创建了类似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()而被删除。

所以我的真正问题是:如何确定何时必须通过nilTThread.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);

最新更新