2013-05-15 94 views
3

我知道你需要synchronize (yourprocedure)來設置例如一個標籤的文本。 但是如何:何時需要在TThread中同步?

  1. 讀取標籤的文本。
  2. 切換/設置標籤的啓用屬性。
  3. 呼叫其他標籤程序/功能(例如onclick事件)。

當我需要使用synchronize時,有一個簡單的規則可以知道/記住嗎?

PS .:是否與PostMessage/SendMessage同步?

回答

9

簡單的經驗法則:任何訪問VCL UI組件需要同步。這包括讀取和寫入UI控件屬性。 Win32用戶界面,最着名的對話框如MessageBox()TaskDialog(),可以直接在工作線程中使用,無需同步。

TThread.Synchronize()SendMessage()類似(實際上,它曾在Delphi 5及更早版本的內部使用SendMessage()實施)。 TThread.Queue()類似於PostMessage()

+0

非常感謝。然後我真的需要做很多程序/功能來同步。 –

3

每次訪問VCL UI組件時,都需要實現某種類型的線程安全措施。通常情況下,當您訪問存在或將被另一個線程訪問的變量或過程時也是如此。但是,您不需要需要以在所有這些情況下使用Synchronize方法。還有其他工具可供您使用,Synchronize並不總是您最佳的解決方案。

在執行傳遞給它的過程時,同步阻塞主線程和調用線程,因此過度使用會降低多線程的好處。同步可能是最常用於更新用戶界面的,但如果您發現必須頻繁使用它,那麼檢查並查看是否可以重構代碼可能不是一個壞主意。 I.E.你真的需要從你的線程中讀取標籤嗎?你可以在啓動線程之前閱讀標籤並將它傳遞給線程的構造函數嗎?你可以在線程的OnTerminate事件處理程序中處理這些任務嗎?

+0

不幸。不需要,我需要在運行線程時偶爾進行檢查。我認爲,只要沒有其他線程試圖設置/寫入地址空間,讀取值/屬性就不應該成爲問題。但它必須謹慎處理。 –

+1

你的措辭是不幸的。調用線程肯定是阻塞的,但主線程肯定不是 - 如果它是如何執行通過的過程呢? – mghie

+1

主線程在執行傳遞的過程時被阻塞......因爲它不響應事件或執行任何其他任務。我相信,爲了找到討論語義的理由,我的發言的意義對於沒有閱讀它的人來說是相當清楚的。 – Aaron