随笔-145  评论-173  文章-70  trackbacks-0
利用AfxBeginThread函数也可以实现创建一个线程,先贴上下面的代码:
UINT SubProcess(LPVOID param)
{
    ::MessageBox((HWND)param,
"线程启动","线程",MB_OK);
    
return 0;
}


void CTest2Dlg::OnButton1() 
{
    
// TODO: Add your control notification handler code here
    HWND hWnd = GetSafeHwnd(); //获得一个窗口的窗口句柄
    AfxBeginThread(SubProcess,hWnd); //创建一个新线程,返回值就是一个线程对象
//    CDialog::OnOK();
}


void CTest2Dlg::OnButton2() 
{
    
// TODO: Add your control notification handler code here
    CDialog::OnCancel();
}

现在对于这个函数,我没有多大的疑问,在MSDN中有很详细的解释,关键的问题是:
我开始出错了:因为将SubProcess设置为类的成员函数,显示的错误信息是:
can't convert parameter 1 from unsigned int (void *);

开始我以为是本身函数的问题,印象中,应该是void *类型才可以,现在这个线程函数是UINT(unsigned int类型)
不过后来查MSDN,发现仅仅只能够是UINT类型的返回值,规定死了。
而且函数的原型是 UINT myThreadFun(LPVOID param)
于是想到,放在类中的成员函数和上面的原型是不同的,所以可能会引起错误,于是去掉之后,声明为一个单独的函数,OK。
我的理解是:在同类,生成的就是一个对象,调用另外一个成员函数,相当于对本身的主线程操作,不安全。

然而,通过验证我发现,原因不是这个,而是因为在普通的成员函数中,隐藏有一个参数为this指针,所以,原型是不同的,要是必须声明为类的成员的话,可以声明为static函数,就没有this指针,此时,就不能访问实例成员,只能访问类成员。要是想要访问实例成员怎么办?声明为友元,这样,就可以毫无顾忌的访问类的所有成员。
至此,我们就解决了这个问题。
posted on 2010-02-09 11:39 deercoder 阅读(2132) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理