Delphi队列和同步参数

时间:2017-02-28 19:12:03

标签: multithreading delphi

我发布了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()而被删除。

所以我真正的问题是:如何确定何时必须通过nilTThread.CurrentThread

  • 我已经明白,在TThread的派生类中,我可以使用匿名方法调用Queue / Sync,因为Self来拯救。

  • 如果我必须在TTask.Run中调用队列或同步,我确定我必须使用nil参数吗?

我对这类事情不熟悉,所以我发现这很难,我想理解这个概念,否则我会创建破坏的应用程序。我看到Nick Hodges在他的书中使用的是nil和CurrentThread,但我无法理解为什么。

1 个答案:

答案 0 :(得分:5)

即使在 TThread 后代执行方法中,您也可以使用 Synchronize Queue 重载 nil 参数。虽然 Synchronize 不受影响,但可以忽略对队列的调用,原因与在队列之前线程完成时的其他情况相同被执行。

Synchronize(nil,
  procedure
  begin
    //code
  end);


Queue(nil,
  procedure
  begin
    //code
  end);