C++Builder的多執行緒程式設計中一些體會。 (轉)
重慶郵電學院 系98級 鄧銳
2001.11
最近在寫一個用到了多執行緒,所以對CB下的多執行緒有一定的學習。
現在把自己的一些心得講一下。水平有限,寫的很粗略,請大家見諒。
CB相對於VC來說,在CB下寫多執行緒程式是很簡單的。不僅是VCL中有TThread這個類。封裝了那些關於多執行緒的WINDOW 。我覺得更方便的是他提供了
直接訪問主VCL執行緒中的能力。可以很容易的和主執行緒中的窗體,
打交道。和單執行緒的方式沒有太多區別。只是在有多個執行緒都要訪問主執行緒
中的物件(比如訪問同一個窗體上的StringGrid).只要用Thread的Synchronize方法來那段訪問主VCL執行緒的程式碼(具體請看幫助),我們就不用擔心訪問衝突的問題了。而且對於多執行緒的同步和互斥,CB也對WINDOW 中那些機制進行了封裝。比如對臨界區CriticalSection封裝為TCriticalSection.事件Event封裝為TEvent.這些類相當簡單好用。
下面就是我覺得比較重要的幾點,供大家參考.
1。TThread的WaitFor方法。是等待一個執行緒返回。其返回值在這個執行緒裡可以任意設定。以便在該執行緒返回的時候讓呼叫他的執行緒知道他的執行情況。
在TThread的 OnTenate事件中做執行緒的清除工作。他不是執行緒執行的一部分。
而是主VCL執行緒的一部分。所以在其中不能訪問Thread的區域性變數(如 int __thread i)
你可以把清楚程式碼寫在這裡,不用管現在在EXCUTE()方法到了哪個地方。
這麼看起來有點類似於C++裡的 finally 塊的作用。
2。TEvent很重要。實現執行緒的同步。WaitFor(int Timeout)功能類似於
WINDOW API WaitforSingle().返回值包括:
其中引數Timeout可以設為INFINITE表示永久等待,但這樣,程式很容易死在這裡。
wrSignaled 該事件發生(成功返回).
wrTimeout 等待超時.
wrAbandoned 在該事件的超時期限到達前,該事件物件已經被毀滅了。.
wrError 在等待過程中有異常產生,要知道具體產生的錯誤要檢視 TEvent的LastError
屬性。
3? TCriticalSection
這個相當於程式設計中的臨界區。
在多執行緒程式設計中,多個執行緒需要訪問同一個公用變數的時候。
來保證訪問的正確性。對公用變數訪問的程式碼寫在Enter();和Leave()之間。
比如有個公用變數 Count;
以下程式碼 :
TCriticalSection * pSection=new TCriticalSection();
pSection->Enter();
Count++;
pSection->Leave();
delete p;
Enter()方法進入臨界區,對其中的公用變數加鎖。
Leave()方法離開臨界區,對其中的公用變數解鎖。
4.TMultiReadExclusiveWriteSynchronizer
用來處理類似於多個生產者和多個消費者的問題。這裡的消費者是指
對公用變數進行讀操作的執行緒。
生產者是對公用變數進行寫操作的執行緒。
四個方法。
BeginRead
EndRead
這兩個方法用於消費者。
BeginWrite
EndWrite
這兩個方法用於生產者。
使用的時候就是要把這個TMutiReadExclusiveWriteSynchronizer 定義一個全域性變數。
然後在其他執行緒中訪問他。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990656/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實戰體會Java的多執行緒程式設計Java執行緒程式設計
- 多執行緒程式設計(轉)執行緒程式設計
- .NET多執行緒程式設計(1):多工和多執行緒 (轉)執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計
- 程式設計思想之多執行緒與多程式(3):Java 中的多執行緒程式設計執行緒Java
- 程式設計思想之多執行緒與多程式(4):C++ 中的多執行緒程式設計執行緒C++
- .NET多執行緒程式設計(4):執行緒池和非同步程式設計 (轉)執行緒程式設計非同步
- 多執行緒程式設計執行緒程式設計
- Linux下的多執行緒程式設計(轉)Linux執行緒程式設計
- DELPHI下的多執行緒程式設計(1) (轉)執行緒程式設計
- DELPHI下的多執行緒程式設計(2) (轉)執行緒程式設計
- Java多執行緒程式設計入門(轉)Java執行緒程式設計
- iOS多執行緒程式設計總結(中)iOS執行緒程式設計
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Boost多執行緒程式設計執行緒程式設計
- UNIX多執行緒程式設計執行緒程式設計
- Java程式中的多執行緒(1)(轉)Java執行緒
- Java程式中的多執行緒(2)(轉)Java執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- 深入淺出Java多執行緒程式設計(轉)Java執行緒程式設計
- 多程式多執行緒程式設計彙總(持續更新中)執行緒程式設計
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- C#多執行緒程式設計(1):執行緒的啟動C#執行緒程式設計
- python 多執行緒程式設計Python執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- GCD 與多執行緒程式設計GC執行緒程式設計
- IOS多執行緒程式設計:概述iOS執行緒程式設計
- C#多執行緒程式設計C#執行緒程式設計
- linux 多執行緒程式設計Linux執行緒程式設計
- 多執行緒程式設計ExecutorService用法執行緒程式設計
- Linux下應用程式開發:QT中的多執行緒程式設計(轉)LinuxQT執行緒程式設計
- 多執行緒程式設計中的幾個基本概念執行緒程式設計
- Java程式設計師面試中的多執行緒問題Java程式設計師面試執行緒