亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi中的線程類--之(2)

2019-11-18 18:28:07
字體:
來源:轉載
供稿:網友
 

Delphi中的線程類

 

猛禽[Mental Studio]

http://mental.mentsu.com

 

之二

首先就是構造函數:

constructor TThread.Create(CreateSuspended: Boolean);

begin

  inherited Create;

  AddThread;

  FSuspended := CreateSuspended;

  FCreateSuspended := CreateSuspended;

  FHandle := BeginThread(nil, 0, @ThreadPRoc, Pointer(Self), CREATE_SUSPENDED, FThreadID);

  if FHandle = 0 then

    raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);

end;

雖然這個構造函數沒有多少代碼,但卻可以算是最重要的一個成員,因為線程就是在這里被創建的。

在通過Inherited調用TObject.Create后,第一句就是調用一個過程:AddThread,其源碼如下:

procedure AddThread;

begin

  InterlockedIncrement(ThreadCount);

end;

同樣有一個對應的RemoveThread

procedure RemoveThread;

begin

  InterlockedDecrement(ThreadCount);

end;

它們的功能很簡單,就是通過增減一個全局變量來統計進程中的線程數。只是這里用于增減變量的并不是常用的Inc/Dec過程,而是用了InterlockedIncrement/InterlockedDecrement這一對過程,它們實現的功能完全一樣,都是對變量加一或減一。但它們有一個最大的區別,那就是InterlockedIncrement/InterlockedDecrement是線程安全的。即它們在多線程下能保證執行結果正確,而Inc/Dec不能?;蛘甙?a href="http://www.49028c.com/system.asp">操作系統理論中的術語來說,這是一對“原語”操作。

以加一為例來說明二者實現細節上的不同:

一般來說,對內存數據加一的操作分解以后有三個步驟:

1、  從內存中讀出數據

2、  數據加一

3、  存入內存

現在假設在一個兩個線程的應用中用Inc進行加一操作可能出現的一種情況:

1、  線程A從內存中讀出數據(假設為3

2、  線程B從內存中讀出數據(也是3

3、  線程A對數據加一(現在是4

4、  線程B對數據加一(現在也是4

5、  線程A將數據存入內存(現在內存中的數據是4

6、  線程B也將數據存入內存(現在內存中的數據還是4,但兩個線程都對它加了一,應該是5才對,所以這里出現了錯誤的結果)

而用InterlockIncrement過程則沒有這個問題,因為所謂“原語”是一種不可中斷的操作,即操作系統能保證在一個“原語”執行完畢前不會進行線程切換。所以在上面那個例子中,只有當線程A執行完將數據存入內存后,線程B才可以開始從中取數并進行加一操作,這樣就保證了即使是在多線程情況下,結果也一定會是正確的。

前面那個例子也說明一種“線程訪問沖突”的情況,這也就是為什么線程之間需要“同步”(Synchronize),關于這個,在后面說到同步時還會再詳細討論。

說到同步,有一個題外話:加拿大滑鐵盧大學的教授李明曾就Synchronize一詞在“線程同步”中被譯作“同步”提出過異議,個人認為他說的其實很有道理。在中文中“同步”的意思是“同時發生”,而“線程同步”目的就是避免這種“同時發生”的事情。而在英文中,Synchronize的意思有兩個:一個是傳統意義上的同步(To occur at the same time),另一個是“協調一致”(To Operate in unison)。在“線程同步”中的Synchronize一詞應該是指后面一種意思,即“保證多個線程在訪問同一數據時,保持協調一致,避免出錯”。不過像這樣譯得不準的詞在IT業還有很多,既然已經是約定俗成了,本文也將繼續沿用,只是在這里說明一下,因為軟件開發是一項細致的工作,該弄清楚的,絕不能含糊。

 

扯遠了,回到TThread的構造函數上,接下來最重要就是這句了:

FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);

這里就用到了前面說到的Delphi RTL函數BeginThread,它有很多參數,關鍵的是第三、四兩個參數。第三個參數就是前面說到的線程函數,即在線程中執行的代碼部分。第四個參數則是傳遞給線程函數的參數,在這里就是創建的線程對象(即Self)。其它的參數中,第五個是用于設置線程在創建后即掛起,不立即執行(啟動線程的工作是在AfterConstruction中根據CreateSuspended標志來決定的),第六個是返回線程ID

現在來看TThread的核心:線程函數ThreadProc。有意思的是這個線程類的核心卻不是線程的成員,而是一個全局函數(因為BeginThread過程的參數約定只能用全局函數)。下面是它的代碼:

function ThreadProc(Thread: TThread): Integer;

var

  FreeThread: Boolean;

begin

  try

    if not Thread.Terminated then

    try

      Thread.Execute;

    except

      Thread.FFatalException := AcquireExceptionObject;

    end;

  finally

    FreeThread := Thread.FFreeOnTerminate;

    Result := Thread.FReturnValue;

    Thread.DoTerminate;

    Thread.FFinished := True;

    SignalSyncEvent;

    if FreeThread then Thread.Free;

    EndThread(Result);

  end;

end;

雖然也沒有多少代碼,但卻是整個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;

也很簡單,就是設置一下一個全局EventSyncEvent,關于Event的使用,本文將在后文詳述,而SyncEvent的用途將在WaitFor過程中說明。

然后根據FreeThread中保存的FreeOnTerminate設置決定是否釋放線程類,在線程類釋放時,還有一些些操作,詳見接下來的析構函數實現。

最后調用EndThread結束線程,返回線程返回值。

至此,線程完全結束。

 (待續)


上一篇:Delphi中的線程類--之(3)

下一篇:DELPHI實現activex控件的限制

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲a区在线视频| 国产精品国产自产拍高清av水多| 国产精品91在线观看| 国产日韩欧美中文| 欧美精品电影免费在线观看| 国产精品日韩欧美| 成人黄色免费在线观看| 色妞在线综合亚洲欧美| 夜夜嗨av一区二区三区免费区| 欧美黑人一级爽快片淫片高清| 亚洲男人天堂2019| 久久69精品久久久久久国产越南| 国产丝袜一区视频在线观看| 亚洲欧美日韩精品久久奇米色影视| xxxxx成人.com| 欧美日韩国产丝袜另类| 亚洲精品久久久久中文字幕二区| 亚洲丝袜在线视频| 亚洲的天堂在线中文字幕| 国产精品视频导航| 啊v视频在线一区二区三区| 亚洲精品欧美极品| 欧美孕妇与黑人孕交| 亚洲最大成人在线| 亚洲成人教育av| 成人信息集中地欧美| 国产精品久久久久久一区二区| 亚洲国产精品久久久久秋霞蜜臀| 国产精品久久97| 亚洲欧洲日韩国产| 国产一区二区三区在线观看视频| 精品人伦一区二区三区蜜桃网站| 国产一区二区三区高清在线观看| 成人h视频在线观看播放| 78色国产精品| 国产精品欧美久久久| 色琪琪综合男人的天堂aⅴ视频| 久久精品久久久久电影| 日韩高清av一区二区三区| 免费97视频在线精品国自产拍| 精品一区精品二区| 91精品91久久久久久| 精品视频中文字幕| 日本一区二三区好的精华液| 精品成人乱色一区二区| 国产亚洲美女精品久久久| 国产精品免费视频久久久| 色综合五月天导航| 欧美日韩人人澡狠狠躁视频| 久久综合伊人77777| 日韩精品视频免费在线观看| 久久久久国产一区二区三区| 欧美电影免费观看高清| 国产精品视频不卡| 欧美成人精品在线观看| 91精品国产91久久久久久最新| 国产综合在线观看视频| 欧美成aaa人片在线观看蜜臀| 欧美激情精品久久久久久免费印度| 国产一区二区三区三区在线观看| 国内外成人免费激情在线视频| 欧美在线亚洲在线| 国产成人拍精品视频午夜网站| 国产精品久久久久久搜索| 国产精品成人v| 欧美一乱一性一交一视频| 日韩精品在线观| 国产精品久久久久久久久久99| 亚洲男子天堂网| 亚洲精品在线不卡| 91久久久久久久久久| 亚洲国内精品视频| 国产精品美女主播| 亚洲成人av片在线观看| 在线成人免费网站| 91久久久久久久| 97精品一区二区三区| 国产精品久久久av久久久| 亚洲第一网站免费视频| 色综合久久久久久中文网| 日韩a**站在线观看| 在线亚洲欧美视频| 国产精品久久久久久久9999| 国产视频精品在线| 中文字幕亚洲色图| 欧美成人免费网| 亚洲视频在线观看免费| www.日韩免费| 狠狠躁夜夜躁人人爽超碰91| 4444欧美成人kkkk| 国产亚洲成精品久久| 欧美人交a欧美精品| 91av网站在线播放| 亚洲最大在线视频| 国产精品一久久香蕉国产线看观看| 精品久久久在线观看| 亚洲国产一区二区三区四区| 亚洲一区二区精品| 久久青草精品视频免费观看| 国产精品视频永久免费播放| 亚洲成人精品视频在线观看| 色婷婷综合久久久久| 欧美一级大片在线免费观看| 欧美日本高清一区| 国产免费亚洲高清| 欧美大尺度电影在线观看| 91在线视频免费| 成人网在线免费看| 黑人巨大精品欧美一区二区| 国产91色在线| 亚洲高清免费观看高清完整版| 成人免费视频97| 国产精品电影久久久久电影网| 久久久免费精品视频| 国产精品久久一| 福利一区福利二区微拍刺激| 日本欧美一二三区| 日本aⅴ大伊香蕉精品视频| 亚洲人成毛片在线播放| 国产视频亚洲视频| 亚洲欧美日韩久久久久久| 久久久久久国产精品三级玉女聊斋| 国产69久久精品成人看| 欧美午夜性色大片在线观看| 日韩一区视频在线| 欧美激情亚洲综合一区| 久久亚洲春色中文字幕| 国产一区二区精品丝袜| 中文字幕在线成人| 国产亚洲成av人片在线观看桃| 久久久999精品免费| 久久久精品免费视频| 欧美成人精品三级在线观看| 97久久伊人激情网| 亚洲欧洲一区二区三区在线观看| 中日韩美女免费视频网站在线观看| 2019最新中文字幕| 欧美亚洲成人网| 98午夜经典影视| 国产精品亚洲一区二区三区| 欧美肥老妇视频| 欧美一区二区三区精品电影| 亚洲国产成人精品久久久国产成人一区| 国产日韩精品在线观看| 欧美激情一区二区三区高清视频| 久久久噜噜噜久久中文字免| 日韩视频在线一区| 国产97在线播放| 精品五月天久久| 国产成人久久久| 欧美一区在线直播| 亚洲人成电影网站色www| 欧美日韩亚洲一区二区| 精品国产1区2区| 在线激情影院一区| 91久久国产综合久久91精品网站| 欧美日韩国产黄| 久久久免费观看| 国产精品av免费在线观看| 91精品视频免费观看| 午夜精品理论片| 成人午夜高潮视频| 国产日本欧美一区| 欧美一区亚洲一区|