UINT SubProcess(LPVOID param)

{
::MessageBox((HWND)param,"線程啟動(dòng)","線程",MB_OK);
return 0;
}
void CTest2Dlg::OnButton1() 

{
// TODO: Add your control notification handler code here
HWND hWnd = GetSafeHwnd(); //獲得一個(gè)窗口的窗口句柄
AfxBeginThread(SubProcess,hWnd); //創(chuàng)建一個(gè)新線程,返回值就是一個(gè)線程對(duì)象
// CDialog::OnOK();
}
void CTest2Dlg::OnButton2() 

{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
現(xiàn)在對(duì)于這個(gè)函數(shù),我沒(méi)有多大的疑問(wèn),在MSDN中有很詳細(xì)的解釋,關(guān)鍵的問(wèn)題是:
我開(kāi)始出錯(cuò)了:因?yàn)閷ubProcess設(shè)置為類的成員函數(shù),顯示的錯(cuò)誤信息是:
can't convert parameter 1 from unsigned int (void *);
不過(guò)后來(lái)查MSDN,發(fā)現(xiàn)僅僅只能夠是UINT類型的返回值,規(guī)定死了。
而且函數(shù)的原型是 UINT myThreadFun(LPVOID param)
于是想到,放在類中的成員函數(shù)和上面的原型是不同的,所以可能會(huì)引起錯(cuò)誤,于是去掉之后,聲明為一個(gè)單獨(dú)的函數(shù),OK。
我的理解是:在同類,生成的就是一個(gè)對(duì)象,調(diào)用另外一個(gè)成員函數(shù),相當(dāng)于對(duì)本身的主線程操作,不安全。
然而,通過(guò)驗(yàn)證我發(fā)現(xiàn),原因不是這個(gè),而是因?yàn)樵谄胀ǖ某蓡T函數(shù)中,隱藏有一個(gè)參數(shù)為this指針,所以,原型是不同的,要是必須聲明為類的成員的話,可以聲明為static函數(shù),就沒(méi)有this指針,此時(shí),就不能訪問(wèn)實(shí)例成員,只能訪問(wèn)類成員。要是想要訪問(wèn)實(shí)例成員怎么辦?聲明為友元,這樣,就可以毫無(wú)顧忌的訪問(wèn)類的所有成員。
至此,我們就解決了這個(gè)問(wèn)題。



