所謂多執行緒,則是程式在主要的執行緒之外,新增其他執行緒工作,使2個(或多個)執行緒同時進行工作,也稱為平行處理程式。
我的功力只算剛入門,充其量就是剛寫出一個有子執行緒的小程式,這裡做個筆記。
在 VC++ 所建立的 MFC 專案內,假設要加入子執行緒的地方在 testview.cpp 內 (類別為 CTestView,繼承自 CView)
如果要開啟子執行緒的函式為 CTestView::Execute() ,則:
#include "testview.h"ChildThread_Function 是全域函式,函式名稱由使用者自訂
UINT ChildThread_Function ( LPVOID param )
{
CTestView* view = (CTestView*) param;
param->DoSomething();
}
CTestView::DoSomething()
{
....
}
CTestView::Execute()
{
AfxBeginThread( ChildThread_Function, (LPVOID) this, THREAD_PRIORITY_ABOVE_NORMAL);
}
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:
你好,看到你之前在程設版發文.
是否可以請教依下關於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 *)'
想請問一下我的作法有什麼問題
打擾了!謝謝
將 UINT CMy107Dlg::WorkerThreadProc( LPVOID Param ) 在宣告時設成 static function 應該就可以了
ex.
class CMy107Dlg
{
.
.
static UINT WorkerThreadProc( LPVOID Param );
};
Post a Comment