一个对话框程序,默认有一个按钮"确定",其默认处理函数为:
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);//这样做依然会阻塞主线程,不符合要求。
}
//所以,请各位帮助解决一下,多谢!!!!

解决方案 »

  1.   

    利用SendMessage函数即可。
    一般来说On开头的函数都这么调用。
      

  2.   

    UINT _myThread(LPVOID lparam)
    {
      CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
      para->PostQuitMessage(0);
    }
      

  3.   

    用SendMessage或PostMessage发送WM_CLOSE消息试一试!
      

  4.   

    建一公有函数
    CMyDialog::OnMyOtherOk
    {
    CDialog::OnOk();
    }
    在线程中
    para->OnMyOtherOk();
    就搞定!
      

  5.   

    对不起,错了,应该
    UINT _myThread(LPVOID lparam)
    {
      CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
      para->SendMessage(WM_CLOSE,0,0);
    }