在线程中创建非模态对话框的问题

hll127 2011-10-17 09:52:15
我用MFC的向导建立了一个基于对话框的程序,在对话框的OnInitDialog中AfxBeginThread(CommuProc, 0)开启一个线程,线程的代码如下:
UINT CommuProc(LPVOID pParam)
{
MSG msg;

while (1)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == CM_TEST1)
{
CAboutDlg* p = new CAboutDlg;
p->Create(IDD_ABOUTBOX);
ShowWindow(p->m_hWnd, SW_SHOWNORMAL);
}
}
}

return 0;
}
我在开始的对话框上加一个按钮,在按钮的消息处理里向线程发一个CM_TEST1消息,为什么打开关于对话框后程序就挂了?但是我换成打开模态的关于对话框就没事呢?
...全文
230 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameslq 2011-10-19
  • 打赏
  • 举报
回复
非模态对话框的消息在非主线程中,需要手工处理:
代码修改如下:

UINT CommuProc(LPVOID pParam)
{
MSG msg;
CAboutDlg* p = NULL;

while (::GetMessage(&msg,NULL,0,0))
{
//不是非模态对话框则看看是否是其他消息
if (!::IsWindow(p->GetSafeHwnd()) || !::IsDialogMessage(p->GetSafeHwnd(),&msg) )
{
if (msg.message == CM_TEST1)
{
TRACE("OK\n");
p = new CAboutDlg;
p->Create(IDD_ABOUTBOX);
ShowWindow(p->m_hWnd, SW_SHOWNORMAL);
}
//删除消息
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
}


}

if ( p)
delete p;


return 0;
}

1。在其他线程中发送自定义消息CM_TEST1:

PostThreadMessage(papp->m_nThreadID,CM_TEST1,0,0);

2。程序结束时需要手工结束循环,因为是非主线程的原因

PostThreadMessage(papp->m_nThreadID,WM_QUIT,0,0);
hll127 2011-10-19
  • 打赏
  • 举报
回复
我试了一下,因为这句:IsDialogMessage(p->GetSafeHwnd(),&msg),所以程序运行正常了,因为在这句里把对话框的消息处理了。我网上搜了一下:“PeekMessage通常在处理WM_PAINT消息后,不会删除之,除非WM_PAINT所联系的区域为空值,或者WM_PAINT消息被合并处理后,才会删除之”。所以程序之所以挂掉,应该是因为打开非模态对话框后收到WM_PAINT,一直循环着处理WM_PAINT了。所以非自定义的其他消息处理时应该要用:TranslateMessage(&msg)和DispatchMessage(&msg);就没问题了

[Quote=引用 8 楼 gameslq 的回复:]
if (!::IsWindow(p->GetSafeHwnd()) || !::IsDialogMessage(p->GetSafeHwnd(),&msg) )
[/Quote]
hll127 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gameslq 的回复:]

程序有无限循环发现了吗?
[/Quote]
恩,是的。应该是新建的非模态对话框一直没收到消息,所以界面上不响应了。因为我对线程,窗口这块的机制不清楚,所以才会有这个疑惑。谢谢你。
gameslq 2011-10-19
  • 打赏
  • 举报
回复
程序有无限循环发现了吗?
l460602540 2011-10-18
  • 打赏
  • 举报
回复
楼上正解
LuciferStar 2011-10-18
  • 打赏
  • 举报
回复
模态对话框,线程里显示对话框后会等待
非模态对话框,线程里显示后会继续执行后面的代码。
hll127 2011-10-18
  • 打赏
  • 举报
回复
顶一下
hll127 2011-10-17
  • 打赏
  • 举报
回复
代码还是很简单的,可以一运行程序就死了,为什么呢?
[Quote=引用 2 楼 visualeleven 的回复:]
就上面的代码看不出什么问题
[/Quote]
hll127 2011-10-17
  • 打赏
  • 举报
回复
你说的那样的确可以。不过我不明白为什么我这样写程序就死了呢?什么原因呢?
[Quote=引用 1 楼 jennyvenus 的回复:]
在线程中发一个消息,给主窗口,让主窗口创建新窗口。
[/Quote]
Eleven 2011-10-17
  • 打赏
  • 举报
回复
就上面的代码看不出什么问题
用户 昵称 2011-10-17
  • 打赏
  • 举报
回复
在线程中发一个消息,给主窗口,让主窗口创建新窗口。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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