Delphi队列和同步参数

Raf*_*ssi 2 delphi multithreading

我发布了一个让我对多线程感到困惑的问题,我没有在网上找到答案.让我们说我创造了类似的东西TTest = class(TThread),所以你可以想象我有一个执行.在里面我可以打电话:

Synchronize(procedure
            begin
             //code
            end);


Queue(procedure
            begin
             //code
            end);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,上面的代码应该在匿名方法之前有另一个隐藏参数,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);
Run Code Online (Sandbox Code Playgroud)

在这里我使用nil作为参数因为(如果我是正确的)如果我调用了TThread.CurrentThread,当一个Queue完成时,另一个因为RemoveQueuedEvents()而被删除.

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

  • 我已经明白,在TThread的派生类中,如上面的TTest,我可以用匿名方法调用Queue/Sync,因为Self它来拯救.

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

我是这类新手,所以我发现这很难,我想理解这个概念,否则我会创建破碎的应用程序.我看到Nick Hodges在他的书中使用的是nil和CurrentThread,但我无法理解为什么.

Uwe*_*abe 5

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

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


Queue(nil,
  procedure
  begin
    //code
  end);
Run Code Online (Sandbox Code Playgroud)

  • @RaffaeleRossi:有什么不清楚[我之前向你解释过](/sf/ask/2974773721/)?"*当`TThread.Queue()`的第一个参数不是nil时,**排队操作链接到指定的线程,当该线程终止时,如果尚未处理,则取消操作**(线程调用`TThread.RemoveQueuedEvents()`本身.)...传递nil代替避免陷阱.*"...... (4认同)
  • 在任何情况下我都不需要使用CurrentThread.实际上,无论如何你都无法访问匿名方法中的那个参数. (3认同)
  • @RaffaeleRossi:换句话说,如果你想*排队*操作并让它运行,请传递`nil`.如果你想*队列*一个不应该超过给定线程对象的操作(可能因为操作访问该线程的成员等),那么就传递该线程对象.就这样简单. (2认同)