MFC的多執行緒程式設計建立

2021-07-15 15:42:37 字數 906 閱讀 7234

本文主要描述基於mfc的多執行緒技術中的工作者執行緒,包括執行緒的建立、傳遞引數、互斥物件保護以及執行緒的銷毀。還將**執行緒函式作為類的成員函式的情況。

首先需要說明的是工作者執行緒和介面執行緒的區別,介面執行緒(ui執行緒)指的是包含有訊息佇列的執行緒,可以使用訊息機制相互通訊;工作者執行緒則沒有訊息佇列,能夠傳送訊息,但是不能夠處理windows訊息。

mfc中的建立乙個執行緒的通常使用afxbeginthread,參考msdn 使用 c++ 和 mfc 進行多執行緒程式設計

,此函式有兩個版本,建立ui執行緒需要先從cwinthread類派生類,並作為第乙個引數傳遞給afxbeginthread;建立工作者執行緒只需要定義執行緒處理函式並將函式位址作為afxbeginthread的第乙個引數即可。

工作者執行緒只允許執行緒建立時傳入乙個lpvoid型的指標,需要傳入大量引數時可以定義乙個結構體,把結構體指標作為引數傳入執行緒函式,執行緒內部通過強制型別轉換得到結構體指標。

執行緒的入口函式一定是全域性函式或者是靜態函式。執行緒函式作為類的成員函式時,必須宣告為靜態函式,因為類成員函式在編譯時會新增this指標,靜態方法屬於類本身而不屬於某個物件,不分配this指標,可以保證正確傳入的lpvoid指標。另外,類的靜態方法只能訪問類的靜態成員變數,

在類的方法中建立執行緒時一般考慮傳入this指標,方便其訪問類中的成員變數。此時類的物件存在,執行緒可以通過物件的指標訪問類的成員變數以及成員函式。

注:若在類中宣告靜態變數,需要在實現檔案中初始化,否則鏈結會出現「無法解析的外部符號」。原因是類中的靜態變數只是宣告。靜態變數屬於類本身,不屬於任何乙個物件,不能在物件建構函式中初始化,一般是在main函式前面採用:

《資料型別》 《類名》 :: 《靜態資料成員名》 = 《值》

的格式初始化,引用類的靜態成員變數是時須按照:

《類名》 :: 《靜態成員名》

的格式進行引用。

MFC多執行緒程式設計

具體來說是 在mfc中呼叫attach的時候 有個巨集叫assert valid 這個方法不允許訪問非本執行緒建立的繼承於。在cwnd函式裡面有乙個valid 的靜態方法,檢測當前執行緒的mfc物件指標,是否在當前執行緒的map中 下面就是這個模組中線程狀態結構體 afx module thread...

MFC 多執行緒程式設計

mfc中有兩類執行緒 分別稱之為工作者執行緒和使用者介面執行緒 二者的主要區別在於工作者執行緒沒有訊息迴圈 而使用者介面執行緒有自己的訊息佇列和訊息迴圈 但對於 win32 的 api 程式設計而言 這兩種執行緒是沒有區別的 它們都只需執行緒的啟動位址即可啟動執行緒來執行任務 在mfc中 一般用全域...

MFC多執行緒程式設計總結

mfc多執行緒程式設計總結 mfc中,在多個執行緒之間通話 資料共享與同步的方法有 1.全域性變數。全域性變數需要用volatile宣告以防止使用暫存器導致出錯。也可以使用interlockedincrement在阻塞其它執行緒的條件下修改單個全域性變數。這是一種簡單的在同一程序中線程之間通話與資料...