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
