如何在新线程中调用主线程(对话框)的CDialog::OnOk()?
一个对话框程序,默认有一个按钮"确定",其默认处理函数为:
CMyDialog::OnMyOk
{
CDialog::OnOk()
}
可是我希望在上面的函数中开辟一个新线程,而且去掉默认的OnOk(),之所以这样做是因为我想在新线程完成后,立即关掉主线程,即点击"确定"按钮后,执行新线程的操作,完成后,立即关闭主线程。因为在执行新线程内的操作时,我要在mydialog内显示一些动画,这样可以避免主线程被锁定。形如:
CMyDialog::OnMyOk
{
AfxBeginThread(_myThread,this);//开始新线程,并将myDialog传入线程
//CDialog::OnOk()//去掉默认处理函数
}
UINT _myThread(LPVOID lparam)
{
CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
....//do sth.
//问题在这里,在新线程执行完代码后,我应该如何做才能关闭myDialog?
//我试了几种方法如下,但均没有成功!
1、para->ONOK();///error,因为OnOk()是protected;
2、::SendMessage(para->m_hWnd,WM_QUIT(或者是WM_CLOSE),NULL,NULL);//无作用
3、为Mydialog添加成员函数CMyDialog::Myok(){CDialog::OnOk();}.
然后:para->Myok()//内存错误。
4、设立事件hEvent,即在主线程的CMyDialog::OnMyOk()中等待,新线程的工作完成后执行SetEvent(hEvent),形如:
CMyDialog::OnMyOk
{
AfxBeginThread(_myThread,this);//开始新线程,并将myDialog传入线程
WaitForSingleObject(hEvent);//这样做依然会阻塞主线程,不符合要求。
}
//所以,请各位帮助解决一下,多谢!!!!