2017-02-28 84 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作爲參數。我要去接受 –