MFC多執行緒編碼 使用者介面執行緒(四)

2021-06-27 06:26:03 字數 2070 閱讀 6100

下面以乙個例項來介紹使用者介面多執行緒程式設計。

建立乙個基於對話方塊的工程 multithreadtest

,在對話方塊 

idd_multithreadtest_dialog 

中加入乙個按鈕 

idc_ui_thread

,標題為

「使用者介面執行緒

」。右擊工程並選中「new class…」

為工程新增基類為 

cwinthread 

派生執行緒類 

cuithread

。給工程新增新對話方塊 

idd_uithreaddlg

,標題為

「執行緒對話方塊

」。為對話方塊 

idd_uithreaddlg 

建立乙個基於 

cdialog 

的類 cuithreaddlg

。使用 

classwizard

為 cuithreaddlg 

類新增 

wm_lbuttondown 

訊息的處理函式 

onlbuttondown如下:

void cuithreaddlg::onlbuttondown(uint nflags, cpoint point) 

在 cuithread.h 

中新增

#include "cuithreaddlg.h"

並在 cuithread 

類中新增 

protected 

變數 cuithreadlg m_dlg:

cuithread類的標頭檔案如下:

#include "cuithreaddlg.h"

// cuithread thread

class cuithread : public cwinthread

}afx_virtual

// implementation

protected:

virtual ~cuithread();

cuithreaddlg m_dlg;

// generated message map functions

//}afx_msg

declare_message_map()

};

分別過載 initinstance()

函式和 

exitinstance()

函式:

bool cuithread::initinstance()

int cuithread::exitinstance()

為避免記憶體洩露,在cuithreaddlg 新增wm_destroy訊息處理函式:

void cuithreaddlg::ondestroy() 

雙擊按鈕 idc_ui_thread,新增訊息響應函式:

void cmultithreadtestdlg::onbtnuithread() 

注意:要把 uithread.h 

中類 cuithread()

的建構函式的特性由 

protected 

改為 public。

使用者介面執行緒的執行次序與應用程式主線程相同,首先呼叫使用者介面執行緒類的initinstance() 函式,如果返回 true,繼續呼叫執行緒的 run()函式,該函式的作用是執行乙個標準的訊息迴圈,並且當收到 wm_quit 訊息後中斷,在訊息迴圈過程中,run()函式檢測到執行緒空閒時(沒有訊息),也將呼叫 onidle() 函式,最後 run() 函式返回, mfc 呼叫exitinstance()函式清理資源。

你可以建立乙個沒有介面而有訊息迴圈的執行緒,例如:你可以從 cwinthread 

派生乙個新類,在 initinstance 函式中完成某項任務並返回 false,這表示僅執行 initinstance 函式中的任務而不執行訊息迴圈,你可以通過這種方法,完成乙個工作者執行緒的功能。

建立使用者介面執行緒

建立使用者介面執行緒 本人節選自 21天學通c 一書 說明 中使用了declare dyncreate巨集,使用該巨集表明mythread類具有動態建立的能力。使用declare message map巨集表明具有訊息對映,可以處理命令訊息。再開啟mythread類的實現檔案 mythread.cp...

使用者介面執行緒AfxBeginThread的使用

使用者介面執行緒在執行時會有乙個視窗介面和與其相對應的視窗函式,所以它可以通過響應訊息來和使用者進行互動。afxbeginthread 函式原型如下 cwinthread afxbeginthread cruntimeclass pthreadclass,從cwinthread派生的runtime ...

使用者介面執行緒AfxBeginThread的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!使用者介面執行緒在執行時會有乙個視窗介面和與其相對應的視窗函式,所以它可以通過響應訊息來和使用者進行互動。afxbeginthread函式原型如下 cwinthread afxbeginthread cruntimeclass pthreadcla...