使用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操作在後台進行,這樣執行緒就可以處理其他事務。這樣,執行緒可以在同一串列埠控制代碼上實現讀寫操作,實現"重疊".
如何建立乙個簡單的執行緒
在symbian中,用rthread來操作執行緒,乙個rthread物件代表乙個執行緒的控制代碼。常用rthead物件來建立或操作其他執行緒。rthread的基類是rhandlebase類,該類封裝了控制代碼的行為。rthread,rprocess,rmutex和rsession base都繼承自r...
如何建立乙個多執行緒任務
a01 01 函式在排程時是序列,只有在第乙個函式返回時才會進行下乙個執行緒。那麼如何讓兩個函式同時工作呢?thread 執行緒技術用於實現併發任務,可以讓多個函式同時執行。main 函式本身被稱為 主線程 第一乙個類 class mytask public os thread return 0 執...
略談如何建立乙個監控執行緒
一般實時監控功能放在乙個單獨開闢的執行緒比較合適,因為這樣可以大大減輕主線程的負擔。下面我談談如何建立乙個監控執行緒 以乙個工程說明 使用vs 2005 新建乙個對話方塊工程 test 在 bool c test dlg oninitdialog 函式裡建立執行緒,具體 如下 dword dwthr...