如何在新线程中调用主线程(对话框)的CDialog::OnOk()?

mfcdeclare 2003-12-23 02:19:36
一个对话框程序,默认有一个按钮"确定",其默认处理函数为:
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);//这样做依然会阻塞主线程,不符合要求。
}


//所以,请各位帮助解决一下,多谢!!!!
...全文
220 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohonghong 2003-12-23
  • 打赏
  • 举报
回复
对不起,错了,应该
UINT _myThread(LPVOID lparam)
{
CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
para->SendMessage(WM_CLOSE,0,0);
}
IDDIALOG 2003-12-23
  • 打赏
  • 举报
回复
建一公有函数
CMyDialog::OnMyOtherOk
{
CDialog::OnOk();
}
在线程中
para->OnMyOtherOk();
就搞定!


vcforever 2003-12-23
  • 打赏
  • 举报
回复
用SendMessage或PostMessage发送WM_CLOSE消息试一试!
xiaohonghong 2003-12-23
  • 打赏
  • 举报
回复
UINT _myThread(LPVOID lparam)
{
CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
para->PostQuitMessage(0);
}
broadoceans 2003-12-23
  • 打赏
  • 举报
回复
利用SendMessage函数即可。
一般来说On开头的函数都这么调用。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧