2017-02-28 105 views
2

我发布了一个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); 

在这里,我已经使用零作为参数,因为(如果我是正确的),如果我叫TThread.CurrentThread,当队列完成其他将因RemoveQueuedEvents被删除()。


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


  • 我已经明白,在派生类的TThread的像TTEST以上我可以叫Queye /同步只用匿名方法,因为Self来抢救。

  • 如果我必须在TTask.Run中调用Queue或Synchronize,例如,我确定必须使用nil参数吗?

我是新来的这种事情,所以我觉得这很难,我想了解这个概念,否则我会创建破碎的应用程序。我看到Nick Hodges在他的书中使用了零和CurrentThread,但我不明白为什么。

回答

4

即使内部的的TThread后代执行方法可以使用同步队列超载与前面所述参数。虽然同步不受影响,调用队列可以出于同样的原因在其他情况下被忽略,当线程队列执行之前完成。

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


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

因此,如果我总是使用不会危险的零参数?但是我仍然需要知道何时可以使用TThread.CurrentThread。 –

+3

我可以看到在任何情况下都不需要使用CurrentThread。实际上你无法访问匿名方法中的那个参数。 –

+0

我只是希望我的程序是线程安全的,所以您确认我始终可以使用nil作为参数。我要去接受 –