程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中的線程類(2)(3)

Delphi中的線程類(2)(3)

編輯:Delphi

雖然也沒有多少代碼,但卻是整個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結束線程,返回線程返回值。

至此,線程完全結束。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved