TThread在Classes單元里的聲明如下
type TThread = class private FHandle: THandle; FThreadID: THandle; FTerminated: Boolean; FSuspended: Boolean; FFreeOnTerminate: Boolean; FFinished: Boolean; FReturnValue: Integer; FOnterminate: TNotifyEvent; FMethod: TThreadMethod; FSynchronizeException: TObject; procedure CallOnTerminate; function GetPriority: TThreadPriority; procedure SetPriority(Value: TThreadPriority); procedure SetSuspended(value: Boolean); protected procedure DoTerminate; virtual; procedure Execute; virtual; abstract; procedure Synchronize(Method: TThreadMethod); property ReturnValue: Integer read FReturnValue write FReturnValue; property Terminated: Boolean read FTerminated; public constructor Create(CreateSuspended: Boolean); destructor Destroy; override; procedure Resume; procedure Terminate; function WaitFor: Integer; property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate; property Handle: THandle read FHandle; property Priority: TThreadPriority read GetPriority write SetPriority; property Suspended: Boolean read FSuspended write Suspended; property ThreadID: THandle read FThreadID; property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate; end;
先說一下TThread的Create的參數
當TThread的Create()被調用的時候,需要傳遞一個布爾型的參數CreateSuspended。如果把這個參數設為False,那么當調用Create()之后,Execute()會被自動調用,也就是自動地執行線程代碼。如果該參數設為True,這樣創建了線程,但是線程創建完成之后是掛起的,需要調用TThread的Resume()來喚醒線程執行。
一般情況下,當你調用Create()后,還會有一些其他的屬性要求設置。所以,這種情況下需要把CreateSuspended參數設置為True,因為在TThread已經執行的情況下設置TThread的屬性可能引起麻煩。
同時注意TThread的Create方法是沒有默認參數的,所以你在創建的一個繼承自TThread的線程類沒有重寫Create方法的話,調用Create的時候必須傳入True或False。不過如果你實現一個繼承自TThread的類,並且可以自己override(重寫)TThread的Create方法,這時候你當然就可以自己定制,比如可以設計一個默認參數為CreateSuspended為True或False。
在講的深一點,在構造函數Create()中隱含調用一個RTL例程BeginThread(),而它又調用了一個API函數CreateThread()來創建一個線程對象的實例。CreateSuspended參數表明是否傳遞CREATE_SUSPENDED標志給CreateThread()。
再說一下Suspend和Resume