MFC中使用者介面執行緒和工作者執行緒的程式設計例項

2021-06-09 18:33:56 字數 3689 閱讀 1836

一般情況下,呼叫afxbeginthread()來一次性地建立並啟動乙個執行緒,但是也可以通過兩步法來建立執行緒:首先建立cwinthread類的乙個

物件,然後呼叫該物件的成員函式createthread()來啟動該執行緒。

virtual bool cwinthread::initinstance();

過載該函式以控制使用者介面執行緒例項的初始化。初始化成功則返回非0值,否則返回0。使用者介面執行緒經常過載該函式,工作者執行緒一般不

使用initinstance()。

virtual int cwinthread::exitinstance();

initinstance()成員函式一樣,該函式也只適用於使用者介面執行緒。

mfc多執行緒程式設計例項

在visual c++

6.0程式設計環境中,我們既可以編寫c風格的32位win32應用程式,也可以利用mfc類庫編寫c++風格的應用程式,二者各有其優缺點。基於win32的

應用程式執行**小巧,執行效率高,但要求程式設計師編寫的**較多,且需要管理系統提供給程式的所有資源;而基於mfc類庫的應用程式可以

快速建立起應用程式,類庫為程式設計師提供了大量的封裝類,而且developer

studio為程式設計師提供了一些工具來管理使用者源程式,其缺點是類庫**很龐大。由於使用類庫所帶來的快速、簡捷和功能強大等優越性,因此

除非有特殊的需要,否則visual

c++推薦使用mfc類庫進行程式開發。

我們知道,mfc中的執行緒分為兩種:使用者介面執行緒和工作者執行緒。我們將分別舉例說明。

用 mfc 類庫程式設計實現工作者執行緒

例程5 multithread5

為了與win32 api對照,我們使用mfc 類庫程式設計實現例程3 multithread3。

建立乙個基於對話方塊的工程multithread5,在對話方塊idd_multithread5_dialog中加入乙個編輯框idc_millisecond,乙個按鈕idc_start,標題

為「開始」

,乙個進度條idc_progress1;

開啟classwizard,為編輯框idc_millisecond新增int型變數m_nmillisecond,為進度條idc_progress1新增cprogressctrl型變數

m_ctrlprogress;

在multithread5dlg.h檔案中新增乙個結構的定義: struct threadinfo

;

執行緒函式的宣告:uint threadfunc(lpvoid lpparam);

注意,二者應在類cmultithread5dlg的外部。

在類cmultithread5dlg內部新增protected型變數:

cwinthread* pthread;

在multithread5dlg.cpp檔案中進行如下操作:定義公共變數:threadinfo info;

雙擊按鈕idc_start,新增相應訊息處理函式:

void cmultithread5dlg::onstart()

在函式bool cmultithread3dlg::oninitdialog()中新增語句:

新增執行緒處理函式: uint threadfunc(lpvoid lpparam)

return 0;

}

用 mfc 類庫程式設計實現使用者介面執行緒

建立使用者介面執行緒的步驟:

使用classwizard建立類cwinthread的派生類(以cuithread類為例) class cuithread : public

cwinthread

}afx_virtual

// implementation

protected:

virtual ~cuithread();

// generated message map functions

//}afx_msg

declare_message_map()

};

過載函式initinstance()和exitinstance()。 bool cuithread::initinstance()

建立新的使用者介面執行緒 void cuithreaddlg::onbutton1()

請注意以下兩點:

a、在uithreaddlg.cpp的開頭加入語句: #include "uithread.h"

b、把uithread.h中類cuithread()的建構函式的特性由 protected 改為 public。

使用者介面執行緒的執行次序與應用程式主線程相同,首先呼叫使用者介面執行緒類的initinstance()函式,如果返回true,繼續呼叫執行緒的run()

函式,該函式的作用是執行乙個標準的訊息迴圈,並且當收到wm_quit訊息後中斷,在訊息迴圈過程中,run()函式檢測到執行緒空閒時(沒有消

息),也將呼叫onidle()函式,最後run()函式返回,mfc呼叫exitinstance()函式清理資源。

你可以建立乙個沒有介面而有訊息迴圈的執行緒,例如:你可以從cwinthread派生乙個新類,在initinstance函式中完成某項任務並返回

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

例程6 multithread6

建立乙個基於對話方塊的工程multithread6,在對話方塊idd_multithread6_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)

在uithread.h中新增 #include "uithreaddlg.h"

並在cuithread類中新增protected變數cuithread m_dlg: class cuithread : public cwinthread

}afx_virtual

// implementation

protected:

cuithreaddlg m_dlg;

virtual ~cuithread();

// generated message map functions

//}afx_msg

declare_message_map()

};

分別過載initinstance()函式和exitinstance()函式: bool cuithread::initinstance()

int cuithread::exitinstance()

雙擊按鈕idc_ui_thread,新增訊息響應函式: void cmultithread6dlg::onuithread()

並在multithread6dlg.cpp的開頭新增: #include "uithread.h"

好了,編譯並執行程式吧。每單擊一次「使用者介面執行緒」按鈕,都會彈出乙個執行緒對話方塊,在任何乙個執行緒對話方塊內按下滑鼠左鍵,都會

彈出乙個訊息框。

Windows 執行緒漫談 介面執行緒和工作者執行緒

每個系統都有執行緒,而執行緒的最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應力。執行緒分為介面執行緒和工作者執行緒,介面實際就是乙個執行緒畫出來的東西,這個執行緒維護乙個 訊息佇列 訊息佇列 也是介面執行緒和工作者執行緒的最大區別,這個詞應該進到你的腦子裡,根深蒂固的!...

Windows執行緒漫談介面執行緒和工作者執行緒

每個系統都有執行緒,而執行緒的最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應力。執行緒分為介面執行緒和工作者執行緒,介面實際就是乙個執行緒畫出來的東西,這個執行緒維護乙個 訊息佇列 訊息佇列 也是介面執行緒和工作者執行緒的最大區別,這個詞應該進到你的腦子裡,根深蒂固的!...

MFC工作者執行緒

工作者執行緒 1.在標頭檔案中新增uint threadfunc lpvoid lpparam 注意應在類的外部 2.新增protected型變數 cwinthread pthread 3.新增執行緒處理函式 uint threadfunc lpvoid lpparam return 0 4.開啟執...