Q:
請問AfxBeginThread (WriteRandData,LPVOID pParam) 要如何傳遞參數到
UINT WriteRandData(LPVOID pParam)?thanks!
於 MFC 中使用 AfxBeginThread() , 其第一個 為 Thread function name.
其寫法有一定的規定.
正確寫法如下
Uint CXXDialog::Dhcprenew(LPvoid lpParam)
{
:
:
return 0;
}
在 CXXDialog class 中定義為
class CXXDialog : public CDialog
{
:
public:
static Uint Dhcprenew(LPvoid lpParam); //一定要加 static 關鍵字, 以確保當dialog 關掉而 Thread 尚未結束前, Thread 的記憶體不會因dialog 被關而一起結束而產生錯誤
}
其中 lpParam 為一個 NULL pointer, 你可以用他來指向一個你所需要的資料結構,
例如要傳一個數值, 你可以這樣寫, 就不會有錯誤.
void CXXDialog::CreateThread()
{
:
int* id = new int;
*id = 0x1234;
::AfxBeginThread(Dhcprenew, id);
}
Uint CXXDialog::Dhcprenew(LPvoid lpParam)
{
int* pId = (int*)lpParam; // 用一個 int* 指向 null pointer 的位置, 並且做形別轉換.
int nID = *pId; // 取得資料值
delete pId; //將之前所 new 的位置, 於 Thread 中 free 掉.
:
return 0;
}
你也可以將 null pointer 指向一個資料結構, 以傳給 thread 使用.
例如
typedef struct tagTEST
{
int nID;
CXXDialog pDlg;
CString sName;
} THREAD_PARAM, *LPTHREAD_PARAM;
void CXXDialog::CreateThread()
{
:
LPTHREAD_PARAM lpParam = new THREAD_PARAM;
lpParam->nID = 0x1234;
lpParam->pDlg = this;
lpParam->sName = "Test";
::AfxBeginThread(Dhcprenew, lpParam);
}
Uint CXXDialog::Dhcprenew(LPvoid lpParam)
{
LPTHREAD_PARAM lpParam = (LPTHREAD_PARAM)lpParam;
THREAD_PARAM stParam;
stParam.nID = lpParam->nID;
stParam.pDlg = lpParam->pDlg;
stParam.sName = lpParam->sName;
delete lpParam; //將之前所 new 的位置, 於 Thread 中 free 掉.
:
(做你 Thread 要做的事)
:
return 0;
}
>static Uint Dhcprenew(LPvoid lpParam); //一定要加 static 關鍵字, 以確保當dialog 關掉而 Thread 尚未結束前, Thread 的記憶體不會因dialog 被關而一起結束而產生錯誤
這個倒不是最主要的原因. 加 'static' 是因為 non-static 成員的 calling convention 跟 thread function 的不符合: Non-Static 成員有一個隱藏的 this 指標.
>其中 lpParam 為一個 NULL pointer, 你可以用他來指向一個你所需要的資料結構,
我想您真正的意思是 void pointer 吧.
MFC 物件無法跨 thread 來 access Windows 物件. 正確的做法是用 Windows APIs 來做.
from:http://www.programmer-club.com.tw/showSameTitleN/vcdotnet/1545.html
Q:
HANDLE hEventThread = CreateThread(0,0,EventFun,NULL,0,NULL);和AfxBeginThread,這兩個所建立的執行緒有什麼差別?
CreateThread() 是 Win32 API 裡最基本的 Thread 命令, AfxBeginThread() 是 MFC 特別包裝給 MFC 物件用的, 因為 MFC 有一些共用的資料, AfxBeginThread() 會在建立 Thread 之後, 初始一些 Thread 的共用資料空間。若是 MFC 的程式, 一定要用 AfxBeginThread(), 避免直接呼叫 CreateThread()
留言列表