• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

没有m_hWnd消息阻塞如何解决

社会栋梁 2011-08-02 09:18:33
修改一处代码
void CMyDialog::WaitForMsg(int value)
{
while(TRUE)
{
if(m_value > value)
break;
}
Sleep(0);
}


这里vlue是通过其他线程PostMessage过来更新的
当CMyDialog dlg;
dlg.DoModel;时正常

但是有其他地方调用dlg.WaitForMsg(int value),这是dlg没有DoModel;
这里就阻塞了


改成
        MSG msg;
while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );


if(m_dValve>value)
break;
}


因为没有DoModel,所以PeekMessage不到消息,也是阻塞的


请教有什么快捷的办法解决此处问题?
...全文
88 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zzw820626 2011-08-02
MSG msg;
//设一个定时器,这样就能够收到TIMER消息了,定时检查。凑合用用
::SetTimer(NULL, 1, m_nTimeOut, NULL);
while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );


if(m_dValve>value)
break;
}
回复
社会栋梁 2011-08-02
[Quote=引用 11 楼 ndy_w 的回复:]

你可以描述下你的需求,我觉得这个是设计问题。
[/Quote]

没错,重弄了,谢谢啊
回复
ndy_w 2011-08-02
你可以描述下你的需求,我觉得这个是设计问题。
回复
ndy_w 2011-08-02
其他线程调用wait是什么含义?等待第三个线程PostMessage来更新m_value足够次数?
回复
yearn520 2011-08-02
dlg.WaitForMsg(somevalue);
1。你再while里面不放sleep,那不叫阻塞了,那叫卡死了,把cpu全耗完了。
2。不知道你这个是为了实现什么,你定义个窗口都没有初始化,肯定是接收不了消息的,windows的消息机制时基于窗口的,都没注册,怎么接收?你给一个没有出现的窗口发消息意欲何为呢?如果是通讯可以用其他方式。如果你是想给一个存在的窗口发消息你可以加一个标志位。如果你想只是为了通讯,可以用进程间通讯机制实现,把这个value传过来,比如管道这些,而不用消息。
回复
社会栋梁 2011-08-02
[Quote=引用 7 楼 ndy_w 的回复:]

引用 5 楼 yujia120 的回复:
引用 4 楼 ndy_w 的回复:

语义...是说你调用这个wait,希望什么时候允许调用,在什么时候返回

他这里是要等待一个数值m_value 上升超过一个值value

和界面没有关系的话,用信号量之类的就可以等待了。为何要用对话框?是为了PostMessage吗?
[/Quote]
这个m_value,是通过其他线程PostMessage过来更新的
回复
ndy_w 2011-08-02
[Quote=引用 5 楼 yujia120 的回复:]
引用 4 楼 ndy_w 的回复:

语义...是说你调用这个wait,希望什么时候允许调用,在什么时候返回

他这里是要等待一个数值m_value 上升超过一个值value
[/Quote]
和界面没有关系的话,用信号量之类的就可以等待了。为何要用对话框?是为了PostMessage吗?
回复
Waistcoat22 2011-08-02
把DLG的m_hWnd放到全局变量里。

dlg.WaitForMsg(somevalue);
里判断全局的变量的窗口句柄是否有效,或者也可以在对话框销毁时把全局的窗口句柄变量赋值为NULL
回复
社会栋梁 2011-08-02
[Quote=引用 4 楼 ndy_w 的回复:]

语义...是说你调用这个wait,希望什么时候允许调用,在什么时候返回
[/Quote]
他这里是要等待一个数值m_value 上升超过一个值value
回复
ndy_w 2011-08-02
语义...是说你调用这个wait,希望什么时候允许调用,在什么时候返回
回复
社会栋梁 2011-08-02
[Quote=引用 2 楼 ndy_w 的回复:]

但是有其他地方调用dlg.WaitForMsg(int value),这是dlg没有DoModel;
这里就阻塞了
你这个WaitForMsg语义是什么?在没有DoModal时,是否允许调用?如果不允许,在此之前调用IsWindow检查。
另外死循环不断检查会大量占用CPU,建议用事件同步。
[/Quote]

CMyDialog dlg;
dlg.WaitForMsg(somevalue);
回复
ndy_w 2011-08-02
但是有其他地方调用dlg.WaitForMsg(int value),这是dlg没有DoModel;
这里就阻塞了
你这个WaitForMsg语义是什么?在没有DoModal时,是否允许调用?如果不允许,在此之前调用IsWindow检查。
另外死循环不断检查会大量占用CPU,建议用事件同步。
回复
呔妖怪来嘛 2011-08-02
判断dlg是否显示?
回复
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2011-08-02 09:18
社区公告

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