Delphi線程簡介---Create及其參數、Resume、Suspend


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              

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM