close

 


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()


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 天才R 的頭像
    天才R

    做 個 有 趣 的 人

    天才R 發表在 痞客邦 留言(0) 人氣()