雖然也沒有多少代碼,但卻是整個TThread中最重要的部分,因為這段代碼是 真正在線程中執行的代碼。下面對代碼作逐行說明:
首先判斷線程類的Terminated標志,如果未被標志為終止,則調用線程類的 Execute方法執行線程代碼,因為TThread是抽象類,Execute方法是抽象方法, 所以本質上是執行派生類中的Execute代碼。
所以說,Execute就是線程類中的線程函數,所有在Execute中的代碼都需要 當作線程代碼來考慮,如防止訪問沖突等。
如果Execute發生異常,則通過AcquireExceptionObject取得異常對象,並存 入線程類的FFatalException成員中。
最後是線程結束前做的一些收尾工作。局部變量FreeThread記錄了線程類的 FreeOnTerminated屬性的設置,然後將線程返回值設置為線程類的返回值屬性的 值。然後執行線程類的DoTerminate方法。
DoTerminate方法的代碼如下:
procedure TThread.DoTerminate;
begin
if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;
很簡單,就是通過Synchronize來調用CallOnTerminate方法,而 CallOnTerminate方法的代碼如下,就是簡單地調用OnTerminate事件:
procedure TThread.CallOnTerminate;
begin
if Assigned(FOnTerminate) then FOnTerminate(Self);
end;
因為OnTerminate事件是在Synchronize中執行的,所以本質上它並不是線程 代碼,而是主線程代碼(具體見後面對Synchronize的分析)。
執行完OnTerminate後,將線程類的FFinished標志設置為True。
接下來執行SignalSyncEvent過程,其代碼如下:
procedure SignalSyncEvent;
begin
SetEvent(SyncEvent);
end;
也很簡單,就是設置一下一個全局Event:SyncEvent,關於Event的使用,本文將在後文詳述,而SyncEvent的用途將在WaitFor過程中說明。
然後根據FreeThread中保存的FreeOnTerminate設置決定是否釋放線程類,在 線程類釋放時,還有一些些操作,詳見接下來的析構函數實現。
最後調用EndThread結束線程,返回線程返回值。
至此,線程完全結束。