2.執行緒間通訊
mfc中定義了繼承自csyncobject類的ccriticalsection 、ccevent、cmutex、csemaphore類封裝和簡化了win32 api所提供的臨界區、事件、互斥和訊號量。使用這些同步機制,必須包含"afxmt.h"標頭檔案。下圖給出了類的繼承關係:
作為csyncobject類的繼承類,我們僅僅使用基類csyncobject的介面函式就可以方便、統一的操作ccriticalsection 、ccevent、cmutex、csemaphore類,下面是csyncobject類的原型:
class csyncobject : public cobject
// implementation
public:
virtual ~csyncobject();
#ifdef _debug
cstring m_strname;
virtual void assertvalid() const;
virtual void dump(cdumpcontext& dc) const;
#endif
friend class csinglelock;
friend class cmultilock;};
csyncobject類最主要的兩個函式是lock和unlock,若我們直接使用csyncobject類及其派生類,我們需要非常小心地在lock之後呼叫unlock。
mfc提供的另兩個類csinglelock(等待乙個物件)和cmultilock(等待多個物件)為我們編寫應用程式提供了更靈活的機制,下面以實際來闡述csinglelock的用法:
class cthreadsafewnd
~cthreadsafewnd(){}
void setwindow(cwnd *pwnd)
void paintball(colorref color, crect &rc);
private:
cwnd *m_pcwnd;
ccriticalsection m_csect;
};void cthreadsafewnd::paintball(colorref color, crect &rc)}
int array1[10], array2[10];
cmutexsection section; //建立乙個cmutex類的物件
//賦值執行緒控制函式
uint evaluatethread(lpvoid param)
//拷貝執行緒控制函式
uint copythread(lpvoid param)
}afxbeginthread(evaluatethread, null); //啟動賦值執行緒
afxbeginthread(copythread, null); //啟動拷貝執行緒
上面的例子中啟動了兩個執行緒evaluatethread和copythread,執行緒evaluatethread把10個數賦值給陣列array1,執行緒copythread將陣列array1拷貝給陣列array2。由於陣列的拷貝和賦值都是整體行為,如果不以互斥形式執行**段:
for (int i = 0; i < 10; i++)
array1[i] = i; 和
for (int i = 0; i < 10; i++)
array2[i] = array1[i];
其結果是很難預料的!
bool postthreadmessage(dword idthread, // thread identifier
uint msg, // message to post
wparam wparam, // first message parameter
lparam lparam // second message parameter);
深入淺出Win32多執行緒程式設計之綜合例項 1
本章我們將以工業控制和嵌入式系統中運用極為廣泛的串列埠通訊為例講述多執行緒的典型應用。而網路通訊也是多執行緒應用最廣泛的領域之一,所以本章的最後一節也將對多執行緒網路通訊進行簡短的描述。1.串列埠通訊在工業控制系統中,工控機 一般都基於pc windows平台 經常需要與微控制器通過串列埠進行通訊。...
深入淺出Win32多執行緒程式設計之 五 綜合例項
本章我們將以工業控制和嵌入式系統中運用極為廣泛的串列埠通訊為例講述多執行緒的典型應用。而網路通訊也是多執行緒應用最廣泛的領域之一,所以本章的最後一節也將對多執行緒網路通訊進行簡短的描述。1.串列埠通訊 在工業控制系統中,工控機 一般都基於pc windows平台 經常需要與微控制器通過串列埠進行通訊...
WIN32多執行緒
win32多執行緒學習 1.執行緒建立 handle createthread lpsecurity attributes lpthreadattributes,dword dwstacksize,lpthread start routine lpstartaddress,lpvoid lppara...