2016-07-21 156 views
5

我有一個的TThread對象,並希望能夠啓動/通過一個按鈕來停止線程程序的主要形式。我一直在尋找方法來做到這一點,到目前爲止,我有以下想法:「暫停」,線程與屬性

  1. 終止和釋放線程,當用戶單擊停止,並單擊開始時創建一個新的。
  2. 使用睡眠延遲線程(我不想這樣做)
  3. 有一個屬性是一個布爾值來確定線程是否暫停或不。 Execute中的代碼只有在此布爾值爲false時纔會發生。

我傾向於#3。在主窗體的TThread對象上設置布爾屬性是否是線程安全的?

哪個選項,或任何更好的選擇,我應該去?這是我第一次使用線程,所以任何幫助表示讚賞。

+2

最近版本的Delphi不允許暫停/恢復線程,因爲整個設計(和概念)都有缺陷。您應該避免嘗試這樣做,並切換爲使用發信號事件(例如,TEvent)。查看SyncObjs中的各種事件類型。 –

+1

又見http://stackoverflow.com/questions/4401171/self-suspending-a-thread-in-delphi-when-its-not-needed-and-safely-resuming – kludg

回答

9

1.終止並釋放線程,當用戶單擊停止並單擊開始時創建一個新線程。

這當然是一種選擇,如果開銷最小。

3.有一個屬性是一個布爾值,以確定線程是否已暫停。 Execute中的代碼只有在此布爾值爲false時纔會發生。

你可以這樣做,但你必須定期檢查布爾值,如果設置,則輸入一個等待循環,直到它被清除或線程被髮送信號終止。

會在主窗體的TThread對象上設置一個布爾屬性是線程安全嗎?

與調用TThread.Terminate()一樣,它只是設置布爾TThread.Terminated屬性的線程安全。

我應該選擇哪個選項或更好的選擇?

我使用選項#4 - 使用信號事件而不是布爾值。例如:

​​
+0

Remy,什麼是'CheckPause'方法中的'SysUtils.Abort;'。 –

+0

下一次'Terminate()'被調用後調用'CheckPause()',它會引發'EAbort'異常立即終止線程(因爲'Execute()'不會捕獲它)。 –

-1

退房啓動和停止此線程德爾福維基:http://docwiki.embarcadero.com/RADStudio/Berlin/en/Starting_and_Stopping_Threads

這是適用的,早在德爾福7.可適用再往前追溯,但我無法證實早期版本。

+2

這是問題的評論,不是一個答案。答案在這裏包含相關信息,其中鏈接僅用於提供其他參考。答案應該是獨立的,這樣如果由於某種原因(移動,脫機或其他)導致不在場外的位置不可用,它們就會包含價值。鏈接只有答案不這樣做。 –

+2

歡迎使用堆棧溢出。你還沒有回答這個問題。這個問題需要一個建議,但你忽略了提供一個建議。請[編輯]您的答案,以便解決問題所要求的內容。 –