最近在寫一個程序用到了多線程,所以對CB下的多線程有一定的學習。
現(xiàn)在把自己的一些心得講一下。水平有限,寫的很粗略,請大家見諒。
CB相對于VC來說,在CB下寫多線程程序是很簡單的。不僅是VCL中有TThread這個類。封裝了那些關(guān)于多線程的WINDOW API。我覺得更方便的是他提供了
直接訪問主VCL線程中對象的能力??梢院苋菀椎暮椭骶€程中的窗體,控件
打交道。和單線程的方式?jīng)]有太多區(qū)別。只是在有多個線程都要訪問主線程
中的對象(比如訪問同一個窗體上的StringGrid).只要用Thread的Synchronize方法來調(diào)用那段訪問主VCL線程的代碼(具體請看幫助),我們就不用擔心訪問沖突的問題了。而且對于多線程的同步和互斥,CB也對WINDOW 編程中那些機制進行了封裝。比如對臨界區(qū)CriticalSection封裝為TCriticalSection.事件Event封裝為TEvent.這些類相當簡單好用。
下面就是我覺得比較重要的幾點,供大家參考.
1。TThread的WaitFor方法。是等待一個線程返回。其返回值在這個線程里可以任意設(shè)定。以便在該線程返回的時候讓調(diào)用他的線程知道他的運行情況。
在TThread的 OnTerminate事件中做線程的清除工作。他不是線程運行的一部分。
而是主VCL線程的一部分。所以在其中不能訪問Thread的局部變量(如 int __thread i)
你可以把清楚代碼寫在這里,不用管現(xiàn)在在EXCUTE()方法執(zhí)行到了哪個地方。
這么看起來有點類似于C++里的 finally 塊的作用。
2。TEvent很重要。實現(xiàn)線程的同步。WaitFor(int Timeout)功能類似于
WINDOW API WaitforSingleObject().返回值包括:
其中參數(shù)Timeout可以設(shè)為INFINITE表示永久等待,但這樣,程序很容易死在這里。
wrSignaled 該事件發(fā)生(成功返回).
wrTimeout 等待超時.
wrAbandoned 在該事件的超時期限到達前,該事件對象已經(jīng)被毀滅了。.
wrError 在等待過程中有異常產(chǎn)生,要知道具體產(chǎn)生的錯誤要查看 TEvent的LastError
屬性。
現(xiàn)在把自己的一些心得講一下。水平有限,寫的很粗略,請大家見諒。
CB相對于VC來說,在CB下寫多線程程序是很簡單的。不僅是VCL中有TThread這個類。封裝了那些關(guān)于多線程的WINDOW API。我覺得更方便的是他提供了
直接訪問主VCL線程中對象的能力??梢院苋菀椎暮椭骶€程中的窗體,控件
打交道。和單線程的方式?jīng)]有太多區(qū)別。只是在有多個線程都要訪問主線程
中的對象(比如訪問同一個窗體上的StringGrid).只要用Thread的Synchronize方法來調(diào)用那段訪問主VCL線程的代碼(具體請看幫助),我們就不用擔心訪問沖突的問題了。而且對于多線程的同步和互斥,CB也對WINDOW 編程中那些機制進行了封裝。比如對臨界區(qū)CriticalSection封裝為TCriticalSection.事件Event封裝為TEvent.這些類相當簡單好用。
下面就是我覺得比較重要的幾點,供大家參考.
1。TThread的WaitFor方法。是等待一個線程返回。其返回值在這個線程里可以任意設(shè)定。以便在該線程返回的時候讓調(diào)用他的線程知道他的運行情況。
在TThread的 OnTerminate事件中做線程的清除工作。他不是線程運行的一部分。
而是主VCL線程的一部分。所以在其中不能訪問Thread的局部變量(如 int __thread i)
你可以把清楚代碼寫在這里,不用管現(xiàn)在在EXCUTE()方法執(zhí)行到了哪個地方。
這么看起來有點類似于C++里的 finally 塊的作用。
2。TEvent很重要。實現(xiàn)線程的同步。WaitFor(int Timeout)功能類似于
WINDOW API WaitforSingleObject().返回值包括:
其中參數(shù)Timeout可以設(shè)為INFINITE表示永久等待,但這樣,程序很容易死在這里。
wrSignaled 該事件發(fā)生(成功返回).
wrTimeout 等待超時.
wrAbandoned 在該事件的超時期限到達前,該事件對象已經(jīng)被毀滅了。.
wrError 在等待過程中有異常產(chǎn)生,要知道具體產(chǎn)生的錯誤要查看 TEvent的LastError
屬性。