我知道你需要synchronize (yourprocedure)
來設置例如一個標籤的文本。 但是如何:何時需要在TThread中同步?
- 讀取標籤的文本。
- 切換/設置標籤的啓用屬性。
- 呼叫其他標籤程序/功能(例如onclick事件)。
當我需要使用synchronize
時,有一個簡單的規則可以知道/記住嗎?
PS .:是否與PostMessage/SendMessage同步?
我知道你需要synchronize (yourprocedure)
來設置例如一個標籤的文本。 但是如何:何時需要在TThread中同步?
當我需要使用synchronize
時,有一個簡單的規則可以知道/記住嗎?
PS .:是否與PostMessage/SendMessage同步?
簡單的經驗法則:任何訪問VCL UI組件需要同步。這包括讀取和寫入UI控件屬性。 Win32用戶界面,最着名的對話框如MessageBox()
和TaskDialog()
,可以直接在工作線程中使用,無需同步。
TThread.Synchronize()
與SendMessage()
類似(實際上,它曾在Delphi 5及更早版本的內部使用SendMessage()
實施)。 TThread.Queue()
類似於PostMessage()
。
每次訪問VCL UI組件時,都需要實現某種類型的線程安全措施。通常情況下,當您訪問存在或將被另一個線程訪問的變量或過程時也是如此。但是,您不需要需要以在所有這些情況下使用Synchronize方法。還有其他工具可供您使用,Synchronize並不總是您最佳的解決方案。
在執行傳遞給它的過程時,同步阻塞主線程和調用線程,因此過度使用會降低多線程的好處。同步可能是最常用於更新用戶界面的,但如果您發現必須頻繁使用它,那麼檢查並查看是否可以重構代碼可能不是一個壞主意。 I.E.你真的需要從你的線程中讀取標籤嗎?你可以在啓動線程之前閱讀標籤並將它傳遞給線程的構造函數嗎?你可以在線程的OnTerminate事件處理程序中處理這些任務嗎?
非常感謝。然後我真的需要做很多程序/功能來同步。 –