前話: 其實你們要學會看源碼, 我接下來要說的這些東東,與其等別人講,還不如本身搞幾個代碼試一下,印象還深入點
TThread.Queue和TThread.Synchronize的區別,
效果上:兩者的做用都是讓業務代碼在主線程中執行,差異: Synchronize是阻塞,Queue是非阻塞
代碼上 兩個方法最終都是調用的 class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False)類方法,
差異
Synchronize則是使用了Thread對象中的FSynchronize對象變量,而後QueueEvent爲False來調用TThread.Synchronize類方法,
內部在執行FSynchronize時,建立了事件對象,經過WaitForSingleObject來阻塞執行。
Queue調用是本身建立了一個PSynchronizeRecord, 而後QueueEvent爲True來調用TThread.Synchronize類方法,內部則把PSynchronizeRecord放入SyncList列表中,而後退回,並不直接執行PSynchronizeRecord, 那問題來了,在那裏執行呢?Delphi在TApplication.Idle方法中執行(最終調用了CheckSynchronize)
http://blog.csdn.net/wingleo/article/details/53860300