Wednesday, March 25, 2009

簡單的 MFC 多執行緒寫法

一般程式的執行過程是一個指令一個指令逐步動作,當前一步指令尚未結束前,下一個指令就不會執行,這樣的操作是屬於單執行緒程式。
所謂多執行緒,則是程式在主要的執行緒之外,新增其他執行緒工作,使2個(或多個)執行緒同時進行工作,也稱為平行處理程式。
我的功力只算剛入門,充其量就是剛寫出一個有子執行緒的小程式,這裡做個筆記。

在 VC++ 所建立的 MFC 專案內,假設要加入子執行緒的地方在 testview.cpp 內 (類別為 CTestView,繼承自 CView)
如果要開啟子執行緒的函式為 CTestView::Execute() ,則:
#include "testview.h"

UINT ChildThread_Function ( LPVOID param )
{
 CTestView* view = (CTestView*) param;
 param->DoSomething();
}

CTestView::DoSomething()
{
 ....
}

CTestView::Execute()
{
 AfxBeginThread( ChildThread_Function, (LPVOID) this,  THREAD_PRIORITY_ABOVE_NORMAL);
}
ChildThread_Function 是全域函式,函式名稱由使用者自訂
AfxBeginThread 是MFC內呼叫子執行緒的方法,第一個參數是要執行的全域函式名稱(ChildThread_Function),第2個參數則是該全域函式的傳入值,此處傳入的是 CTestView 的指標。ChildThread_Function 這個子執行緒則是會呼叫 CTestView 的成員函式 DoSomething() 執行工作。

如果 ChildThread_Function 是 CTestView 的類別成員,則必須宣告為 static 才可以︰
class CTestView
{
 ..
 ..
 static UINT ChildThread_Function ( LPVOID param );
};

UINT CTestView::ChildThread_Function ( LPVOID param )
{
 ..
 ..
}

2 comments:

Anonymous said...

你好,看到你之前在程設版發文.
是否可以請教依下關於mfc中AfxBeginThread的用法
我的程式跟上面的有點類似,也是用mfc Dialog based
我參考了上述的寫法,程式碼如下
// create a thread
AfxBeginThread(&CMy107Dlg::WorkerThreadProc,(LPVOID)this);

UINT CMy107Dlg::WorkerThreadProc( LPVOID Param )
{
CMy107Dlg *pDlg=(CMy107Dlg*)Param;

return 1;
}


但編譯器卻發生這樣的錯誤訊息
rror C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1
from type 'unsigned int (__thiscall CMy107Dlg::*)(void *)'

想請問一下我的作法有什麼問題
打擾了!謝謝

Chinson said...

將 UINT CMy107Dlg::WorkerThreadProc( LPVOID Param ) 在宣告時設成 static function 應該就可以了

ex.
class CMy107Dlg
{
.
.
static UINT WorkerThreadProc( LPVOID Param );
};