vc6.0怎么用线程调用类成员函数
voidCMyDlg::OnButton1(){CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)OnButton2,NULL...
void CMyDlg::OnButton1()
{
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)OnButton2,NULL,NULL,NULL);
//调用不了OnButton2() ,该怎么改怎么做
};
void CMyDlg::OnButton2()
{
MessageBeep(64);
};
问题就是那个注释 展开
{
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)OnButton2,NULL,NULL,NULL);
//调用不了OnButton2() ,该怎么改怎么做
};
void CMyDlg::OnButton2()
{
MessageBeep(64);
};
问题就是那个注释 展开
3个回答
展开全部
另外建一个静态成员函数如
static int WorkThread(LPVOID lpParam);
然后可以传入参数了.比如this传给它.
在线程里转化this
int CMyDlg::WorkThread(LPVOID lpParam)
{
CMyDlg* pDlg=(CMyDlg*)lpParam;
pDlg->OnButton2();
return 0;
}
这样,你在Onbutton2中可以使用普通的类成员,而不需要老是在线程中使用pDlg.
还有个前提,如果Onbutton2中有使用到windows相关控件的.在线程退出前,要保证他们有效,否则会死锁或者出错.即,窗口销毁前要保证你的线程已退出.
static int WorkThread(LPVOID lpParam);
然后可以传入参数了.比如this传给它.
在线程里转化this
int CMyDlg::WorkThread(LPVOID lpParam)
{
CMyDlg* pDlg=(CMyDlg*)lpParam;
pDlg->OnButton2();
return 0;
}
这样,你在Onbutton2中可以使用普通的类成员,而不需要老是在线程中使用pDlg.
还有个前提,如果Onbutton2中有使用到windows相关控件的.在线程退出前,要保证他们有效,否则会死锁或者出错.即,窗口销毁前要保证你的线程已退出.
追问
怎么这么麻烦啊,VS2005,VS2008,VS2010会不会也这么麻烦啊
追答
不管vc6.0,还是现在的2005,2008,2010,2012,用线程,就得安全的使用线程.
不然就容易产生内存泄露.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要静态成员才可以.
将定义写成 static void OnButton2(); 就可以了.
将定义写成 static void OnButton2(); 就可以了.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
需要静态成员才可以被调用
另外线程不要调用主窗口(线程)的资源
最好是sendmessage或postmessage
另外线程不要调用主窗口(线程)的资源
最好是sendmessage或postmessage
追问
SENDMESSAGE程序就没用了,static也不行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询