程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ Builder多線程編程中一些體會

C++ Builder多線程編程中一些體會

編輯:關於C++

最近在寫一個程序用到了多線程,所以對CB下的多線程有一定的學習。

現在把自己的一些心得講一下。水平有限,寫的很粗略,請大家見諒。

CB相對於VC來說,在CB下寫多線程程序是很簡單的。不僅是VCL中有TThread這個類。封裝了那些關於多線程的WINDOW API。我覺得更方便的是他提供了

直接訪問主VCL線程中對象的能力。可以很容易的和主線程中的窗體,控件

打交道。和單線程的方式沒有太多區別。只是在有多個線程都要訪問主線程

中的對象(比如訪問同一個窗體上的StringGrid).只要用Thread的Synchronize方法來調用那段訪問主VCL線程的代碼(具體請看幫助),我們就不用擔心訪問沖突的問題了。而且對於多線程的同步和互斥,CB也對WINDOW 編程中那些機制進行了封裝。比如對臨界區CriticalSection封裝為TCriticalSection.事件Event封裝為TEvent.這些類相當簡單好用。

下面就是我覺得比較重要的幾點,供大家參考.

1。TThread的WaitFor方法。是等待一個線程返回。其返回值在這個線程裡可以任意設定。以便在該線程返回的時候讓調用他的線程知道他的運行情況。

在TThread的 OnTerminate事件中做線程的清除工作。他不是線程運行的一部分。

而是主VCL線程的一部分。所以在其中不能訪問Thread的局部變量(如 int __thread i)

你可以把清楚代碼寫在這裡,不用管現在在EXCUTE()方法執行到了哪個地方。

這麼看起來有點類似於C++裡的 finally 塊的作用。

2。TEvent很重要。實現線程的同步。WaitFor(int Timeout)功能類似於

WINDOW API WaitforSingleObject().返回值包括:

其中參數Timeout可以設為INFINITE表示永久等待,但這樣,程序很容易死在這裡。

wrSignaled 該事件發生(成功返回).

wrTimeout 等待超時.

wrAbandoned 在該事件的超時期限到達前,該事件對象已經被毀滅了。.

wrError 在等待過程中有異常產生,要知道具體產生的錯誤要查看 TEvent的LastError

屬性。

3 TCriticalSection

這個相當於WIN32編程中的臨界區。

在多線程編程中,多個線程需要訪問同一個公用變量的時候。

來保證訪問的正確性。對公用變量訪問的代碼寫在Enter();和Leave()之間。

比如有個公用變量 Count;

以下代碼 :

TCriticalSection * pSection=new TCriticalSection();
pSection->Enter();
  Count++;
pSection->Leave();
delete p;

Enter()方法進入臨界區,對其中的公用變量加鎖。

Leave()方法離開臨界區,對其中的公用變量解鎖。

4.TMultiReadExclusiveWriteSynchronizer

用來處理類似於多個生產者和多個消費者的問題。這裡的消費者是指

對公用變量進行讀操作的線程。

生產者是對公用變量進行寫操作的線程。

四個方法。

BeginRead

EndRead

這兩個方法用於消費者。

BeginWrite

EndWrite

這兩個方法用於生產者。

使用的時候就是要把這個TMutiReadExclusiveWriteSynchronizer 定義一個全局變量。然後在其他線程中訪問他。

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