2010-11-17 86 views
8

在delphi XE我可以使用啓動程序,但這種方法不存在德爾福2007年哪個是在delphi 2007中啓動暫停線程的正確方法?

此示例代碼工作正常在Delphi XE,使用開始

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Start; 

,但在2007年德爾福的start過程不存在,所以我使用的是在新版本的delphi中棄用的簡歷程序。

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Resume; 

所以quieon是,這是確定使用resume在Delphi 2007或我必須用另一種方式來啓動一個暫停的線程?

在此先感謝。

回答

19

正確的方式開始暫停的線程是從來沒有在第一時間被掛起的線程。

有更好的方法來創建線程。如果調用者必須爲對象提供一個值才能使類正常工作,那麼請不要將其設置爲可選:將其作爲參數提供給構造函數。如果該參數只有一個有效值,那麼甚至不要將其作爲參數:只需在構造函數中對其進行硬編碼即可。 (?有多少次你寫的,只有有時應該釋放本身終止線程類我從來沒有看到這一點。)

constructor TMyThread.Create(Prop1, Prop2: Integer); 
begin 
    inherited Create(False); 
    FreeOnTerminate := True; 
    Property1 := Prop1; 
    Property2 := Prop2; 
end; 

然後你可以使用創建線程的潤·波普爾方法:剛設置它並忘記它!

MyThread := TMyThread.Create(900, 2); 

調用者沒有創建後做的線程什麼。而且由於它是一個free-on-terminate線程,所以調用者甚至可能根本不會保留對變量MyThread的引用,因爲只要線程運行完畢,引用就會失效。

(擔心那個inherited Create(False)行會創建一個線程,在構造函數的其餘部分運行之前開始運行?不要!十多年前,Delphi 6已經修復了這個問題,線程將自動啓動在構造函數完成後;請參閱TThread.AfterConstruction以瞭解如何。)

+1

+ Inf對於最後一段 – arthurprs 2012-02-08 16:33:47

+0

感謝您增加關於創建和執行順序的信息。我總是開始暫停線程,並以這種確切的恐懼恢復它們。 – 2015-08-03 20:31:48

1

是的,這是舊的Delphi版本沒有Start過程的正確方法。

1

在Delphi 2010及更新版本中不建議使用恢復和暫停。似乎基本上不鼓勵使用它們進行線程同步。他們不是那個意思。

無論如何,如果你想要做的就是恢復一個被創建暫停的線程,那麼在舊版本中調用Resume是安全的。

如果您需要在Delphi 2007和Delphi XE中使用相同的源代碼,那麼您可以使用條件編譯來避免XE中的警告。

而且,看看這個問題,這是關係到你的問題:

TThread.resume is deprecated in Delphi-2010 what should be used in place?

0

你不應該在tthread上調用suspend,這樣做不安全,resume只能用於啓動一個被創建的線程。

在德爾福2010年的暫停和恢復,貶低和方法啓動被引入來加強這一點。

如需更完整的解釋,請在Codegears論壇中查看此thread

5

在構造函數中將CreateSuspended參數設置爲true時創建的線程上調用Resume沒有任何問題。 (爲什麼其他情況下會有一個CreateSuspended參數?)

但是,當您暫停/恢復運行線程的時會遇到麻煩。主要是由於引用了開放資源,如COM對象。 (例如,如果您有一個ADO連接對象處於活動狀態,並且正在運行一個查詢......暫停該線程並嘗試稍後恢復它並不是非常理想......但顯然這並不總是能夠爲您或在這種情況下的數據庫連接)。

如果你對外部引用非常小心,那麼暫停/恢復正在運行的線程會變得更加安全,除了可能會出現的競爭條件外......但這些是許多其他問題...

+0

或者一般情況下,您發送某種請求並等待某種響應的任何實例。 – 2015-08-03 20:32:58