多執行緒技術在VC 串列埠通訊程式中的應用研究

2021-04-28 14:24:46 字數 2125 閱讀 1317

多執行緒技術在vc++串列埠通訊程式中的應用研究

多執行緒技術在vc++串列埠通訊程式中的應用研究

1 概述

2 vc++對多執行緒的支援

使用mfc開發是較普遍的vc++程式設計方法。在vc++6.0下,mfc應用程式的執行緒由cwinthread物件表示。vc++把執行緒分為兩種:使用者介面執行緒和工作者執行緒。使用者介面執行緒能夠提供介面和使用者互動,通常用於處理使用者輸入並相應各種事件和訊息;而工作者執行緒主要用來處理程式的後台任務。

程式一般不需要直接建立cwinthread物件,通過呼叫afxbeginthread()函式就會自動建立乙個cwinthread物件,從而開始乙個程序。建立上述的兩種執行緒都利用這個函式。

執行緒的終止取決於下列事件之一:執行緒函式返回;執行緒呼叫exitthread()退出;異常情況下用執行緒的控制代碼呼叫terminatethread()退出;執行緒所屬的程序被終止。

3 多執行緒在串列埠通訊中的應用

3.1 串列埠通訊對執行緒同步的要求

因為同一程序的所有執行緒共享程序的虛擬位址空間,而在windows 9x/nt系統下執行緒是彙編級中斷,所以有可能多個執行緒同時訪問同乙個物件。這些物件可能是全域性變數,mfc的物件,mfc的api等。串列埠通訊的幾個特點決定了必須採用措施來同步執行緒的執行。

串列埠通訊中,對於每個串列埠物件,只有乙個緩衝區,傳送和接收都要用到,必須建立起同步機制,使得在乙個時候只能進行一種操作,否則通訊就會出錯。

進行串列埠通訊處理的不同執行緒之間需要協調執行。如果乙個執行緒必須等待另乙個執行緒結束才能執行,則應該掛起該執行緒以減少對cpu資源的占用,通過另一程序完成後發出的訊號(執行緒間通訊)來啟用。

vc++提供了同步物件來協調多執行緒的並行,常用的有以下幾種:

csemaphore:訊號燈物件,允許一定數目的執行緒訪問某個共享資源,常用來控制訪問共享資源的執行緒數量。

cmutex:互斥量物件,乙個時刻至多只允許乙個執行緒訪問某資源,未被占用時處於有訊號狀態,可以實現對共享資源的互斥訪問。

cevent:事件物件,用於使乙個執行緒通知其他執行緒某一事件的發生,所以也可以用來封鎖對某一資源的訪問,直到執行緒釋放資源使其成為有訊號狀態。適用於某一線程等待某事件發生才能執行的場合。

ccriticalsection:臨界區物件,將一段**置入臨界區,只允許最多乙個執行緒進入執行這段**。乙個臨界區僅在建立它的程序中有效。

3.2 等待函式

win32 api提供了能使執行緒阻塞其自身執行的等待函式,等待其監視的物件產生一定的訊號才停止阻塞,繼續執行緒的執行。其意義是通過暫時掛起執行緒減少對cpu資源的占用。在某些大型監控系統中,串列埠通訊只是其中事務處理的一部分,所以必須考慮程式執行效率問題,當串列埠初始化完畢後,就使其處於等待通訊事件的狀態,減少消耗的cpu時間,提高程式執行效率。

常用的等待函式是waitforsingleobject()和waitformultipleobjects(),前者可監測單個同步物件,後者可同時監測多個同步物件。

3.3 串列埠通訊的重疊i/o方式

mfc對於串列埠作為檔案裝置處理,用createfile()開啟串列埠,獲得乙個串列埠控制代碼。開啟後setcommstate()進行埠配置,包括緩衝區設定,超時設定和資料格式等。成功後就可以呼叫函式readfile()和writefile()進行資料的讀寫,用waitcommevent()監視通訊事件。closehandle()用於關閉串列埠。

在readfile()和writefile()讀寫串列埠時,可以採取同步執行方式,也可以採取重疊i/o方式。同步執行時,函式直到執行完畢才返回,因而同步執行的其他執行緒會被阻塞,效率下降;而在重疊方式下,呼叫的讀寫函式會立即返回,i/o操作在後台進行,這樣執行緒就可以處理其他事務。這樣,執行緒可以在同一串列埠控制代碼上實現讀寫操作,實現"重疊"。

程式專門建立了乙個串列埠通訊類,下面給出關鍵成員函式的核心**。

以上是專門針對com1的初始化,如果要利用同一函式對不同串列埠初始化,則要在初始化前先進入**臨界區,以保證在某一時刻只進行乙個串列埠的初始化。

在串列埠初始化成功後,就可以建立監控執行緒處理串列埠通訊事件。下面是該執行緒的關鍵**。

這樣監控主程式就可以使用afxbeginthread()函式來產生commthread串列埠監控執行緒。如果要實現對所有埠的同時監控,可以分別對埠建立監控執行緒。

5 小結

作為乙個機房監控系統的組成部分,本串列埠通訊程式在vc++6.0下編譯通過,在使用windows 98/nt的區域網裡執行良好。

多執行緒技術在VC 串列埠通訊程式中的應用研究

多執行緒技術在vc 串列埠通訊程式中的應用研究 1 概述 2 vc 對多執行緒的支援 使用mfc開發是較普遍的vc 程式設計方法。在vc 6.0下,mfc應用程式的執行緒由cwinthread物件表示。vc 把執行緒分為兩種 使用者介面執行緒和工作者執行緒。使用者介面執行緒能夠提供介面和使用者互動,...

串列埠通訊 多執行緒簡單例項

rs 232串列埠 include reg52.h typedef unsigned char uint8 typedef unsigned int uint16 sbit s2 p2 1 sbit en p2 5 uint8 arg uint8 counter 0 void init void 微...

VC 多執行緒同步方式操作串列埠

include includeusing namespace std dword winapi commreceive lpvoid lpparameter dword winapi commsend lpvoid lpparameter handle m hcom int main 設定緩衝區大小...