MFC多執行緒筆記

2021-04-14 23:50:48 字數 2621 閱讀 8952

一.在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...