一.在mfc中建立乙個使用者介面執行緒
1.從cwinthread派生乙個執行緒類cmythread
過載cmythread的initinstance(),exitinstance()
bool cmythread::initinstance()
int cmythread::exitinstance()
2.在要呼叫的類裡頭檔案 定義
cmythread* pthread;
要起執行緒的時候
pthread->createthread();
在cwinthread中的m_pmainwnd存放執行緒主視窗的物件指標,一般在initinstance()
中賦值,當它所指向的視窗被關閉時,mfc類庫將自動終止你的執行緒. 如:
定義全域性變數
cmydialog* pdlg;
在過載執行緒的initinstance()時候設定該值,
pdlg = new cmydialog;
this->m_pmainwnd = pdlg;
成員變數m_pactivewnd存放活躍視窗物件指標,當乙個ole伺服器活躍時它指向容器
應用程式主視窗,其他特性和m_pmainwnd幾乎一樣.
cwinthread類的成員函式getmainwnd獲得執行緒的主視窗,virtual cwnd*
getmainwnd();該函式考慮了應用程式是ole伺服器的情況,所以呼叫它來獲取主窗
口指標,這樣無須考慮這個問題了,通過這個視窗指標,執行緒可以進行一些所需要的
二.用mfc建立乙個工作者執行緒
1.建立工作者執行緒
工作者執行緒通常用於進行程式的後台任務,如計算、排程等工作。它不需要從cwint
hread類派生建立.最重要的是實現完成工作者執行緒任務的執行控制函式.該函式的
入口點是執行緒的啟動點,函式最後執行結束,執行緒就終止了.控制函式的基本結構:
uint controllingfunction(lpvoid pparam)
當函式終止時,返回乙個unit值,指明終止的原因.一般用0來表示成功,其他值表明
錯誤原因,呼叫者可以使用getexitcodethred來獲取這個返回值.
2.啟動工作者執行緒
呼叫afxbeginthread()函式來啟動工作者執行緒,其建立和初始化cwinthread物件,使
用控制函式來啟動執行緒,並返回cwinthread物件指標.
如建立乙個顯示廣告的工作執行緒:定義
static uint loadads(lpvoid pparam);
啟動工作者執行緒
afxbeginthread(loadads,this,thread_priority_lowest);
createthread是系統呼叫
_beginthread是c執行時庫api,_beginthread可移植性好一些
3.執行緒終止
對於工作者執行緒,控制函式結束表明執行緒結束,或者呼叫afxendthread(uint
nexitcode).只用於執行緒內部終止時呼叫.
對於使用者介面執行緒,可以任意處呼叫postquitmessage(int nexitcode)結束執行緒.
//postthreadmessage()
異常終止 terminatethread(); //很危險的函式,如果被終止的執行緒擁有臨界區,它
將不被釋放,和closehandle函式結合起來使用,從安全性和程式的健壯性來講,還是
可以的.
三.執行緒的管理和操作
通過int getthreadpriority()獲取執行緒的優先權,bool setthreadpriority()來
設定執行緒的優先順序。
dword resumethread,dword suspendthread來完成繼續執行和掛起執行緒。
四.執行緒間的通訊
1.使用同步類控制訪問共享資料
2.使用訊息佇列,使用cwinthread::postthreadmessage()向某個執行緒發訊息
五.執行緒的同步
同步物件csyncobject,csemaphore,cmutex,ccriticalsection和cevent
同步訪問物件cmultilock,csinglelock
使用這些物件時候,需要把頭檔案afxmt.h加入到程式中,#include
1.同步物件
csyncobject是乙個抽象類,封裝了win32中最基本的同步物件功能,提供了lock和unlock等基本函式。
在應用程式訪問資源之前必須等待某事件的發生,例如,資料通訊中將資料寫入檔案之前等待資料通訊埠送來的資料,可以使用事件cevent類.
當乙個應用程式中的多個執行緒要訪問資源,例如在同樣的文件之上可以影射多個視窗時,用訊號量csemaphore類控制,使用互斥量cmutex類可以控制多個應用程式訪問資源,尤其是在資源dll中的情況.此外還可以使用臨界區ccriticalsection類來控制一段**執行.如:
定義乙個csemaphore* m_regsem;
m_regsem.lock();
m_regsem.unlock();來設定同步控制標誌.
2.同步訪問物件
如果一次僅等待乙個同步物件,則使用csinglelock類.
在某個特定時刻要使用多個同步物件,則使用cmutilock類
多執行緒MFC
csemaphore semaphorewrite 2,2 資源最多訪問執行緒2個,當前可訪問執行緒數2個 cwinthread pwritea afxbeginthread writea,m ctrla,thread priority normal,0,create suspended pwrit...
MFC多執行緒
如果使用者的應用程式需要有多個任務同時進行相應的處理,則使用多執行緒是較理想的選擇。多執行緒對於網路,列印,字處理,圖形影象,動畫和檔案管理的同乙個系統下執行來說,是非常必要的。在乙個多執行緒程式中,程序必須有乙個主線程,主線程可以在任何需要的時候建立新的執行緒。所有活動的縣城共享程序的資源。解決多...
MFC多執行緒
例項一參考資料 uint threadfun lpvoid pparam afxbeginthread threadfun,null 這就是建立乙個執行緒並執行了,呼叫上面的函式彈出乙個對話方塊.void cmultithread7dlg onsum cwinthread afxbeginthrea...