VCL线程不安全
當您使用的類層次結構的對象如TThread,其屬性和方法都不能保證是線程安全的。也就是說,直接訪問其他窗體屬性或執行方法,則使用的內存不從受其他線程的保護。正因為如此,一個主線程是預留訪問VCL和CLX對象,從而使所有的Windows組件接收到線程發送的消息時進行處理,即讓應用程序上的所有控件同步使用消息循環,而實現該線程同步則需要使用到Synchronize。VCL實現同步方法就是調用線程類的Synchronize的過程,此過程需要一個無參數的procedure,故在此procedure中無法傳遞參數值,但可以通過類的成員來實現。在類的Execute中只須調用Synchronize就可以了。如果在線程中對VCL操作,在連續執行多次以后,會報錯誤或者莫名其妙的顯示錯誤問題,如字體大小變化、字體變粗、消失等,這個問題可以由上述方法修復,把賦值操作讓窗體主線程來完成。關鍵在于對Synchronize參數的定義。定義一個無參數的procedure通過它來訪問其他類的成員。在類的重載Execute中調用Synchronize。
procedure TMyThread.PushTheButton;
beginButton1.Caption := '測試';Button1.Click;
end;
procedure TMyThread.Execute;
begin...Synchronize(PushTheButton);...
end;使用Synchronize將保證你對Button1控件的操作是線程安全的,但如果不使用Synchronize而直接在線程的Execute方法中執行因為執行不是線程安全的則會出現各種問題,如果不執行Button1的click事件,或者Button1的caption顯示字體忽大忽小等。在應用程序中并不是所有的類需要使用主線程,因此當你知道一個對象的方法是線程安全的則可以省略使用Synchronize方法,這樣將提高性能,因為不需要等待VCL或CLX線程進入消息循環:1)控件不是線程安全的,因此在對象中操作控件需要使用Synchronize方法來進行同步顯示;2)圖形對象是線程安全的,您不需要使用主VCL或CLX的線程訪問TFont,TPEN,TBrush,TBitmap,TMetafile(VCL),TDrawing(CLX),或TICON,Canvas對象可以用來鎖定外同步方法;3)列表對象不是線程安全的,你可以使用一個線程安全的版本,TThreadList,而不是TLIST。
?
轉載于:https://www.cnblogs.com/moonwind/p/4495798.html
總結
- 上一篇: 带徘的网名99个
- 下一篇: 阴阳师金鱼姬邀请谁参加女子会