主线程等待循环中,因为DispatchMessage()阻塞遗漏同步事件,怎么解决啊!!!

lfxiansheng 2017-11-17 04:15:26
这个是主线程中的部分代码;
主线程中需要创建非模态对话框,当鼠标按住对话框标题栏移动时,下面的等待循环while(TRUE)就卡在下面的DispatchMessage(&msg); 函数上了,因为DispatchMessage函数要等待消息处理函数返回;因为是主线程要求响应消息,有界面控件输入,所以必须要响应消息。有没有什么函数可以替代DispatchMessage函数,可以不需要等待返回?用PostMessage发送消息行不通。
当主线程界面的CListCtrl控件有滚动条时,鼠标点住滚动条时同样是会堵塞,应该都是DispatchMessage函数等待返回。
大神们,有没有什么解决方案既可以让主界面正常响应消息,又不会堵塞While循环,不遗漏同步事件的啊????????

hPrsEvents=CreateEvent(NULL,FALSE,FALSE,NULL);
hPrsDEvents=CreateEvent(NULL,FALSE,FALSE,NULL);
hDAQThread=AfxBeginThread(CDaqUsb1616HS::DaqScanT,&m_daq); // 数据采集线程
hPrcThread=AfxBeginThread(CDataPreAnalyse::DaqRundataPrc,&m_dpa); //数据处理线程
hAllEvents[0]=hPrsEvents;
hAllEvents[1]=hPrsDEvents;

while (TRUE)
{
dwRet = MsgWaitForMultipleObjects (2, hAllEvents, FALSE, INFINITE, QS_ALLINPUT); //等待
switch(dwRet)
{
case WAIT_OBJECT_0: //停止
str.Format("数据采集结束!采集次数=%ld,显示存储数量=%ld;",m_daq.daqP.SampleNum,i);
strInfo=str;

break; //break the loop
case WAIT_OBJECT_0+1: // 数据更新
i++;
str.Format("显示数据个数i=%ld,数据处理次数=%d;",i,m_dpa.dataP.iPrsTimes);
strInfo=str;
SetStatusInfo(strInfo,1);
UpdateShow();
continue;
case WAIT_OBJECT_0 + 2:
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg); ////当鼠标按住对话框标题栏移动时
}
continue;
default:
break; // unexpected failure
}
break;
}
...全文
957 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2017-12-12
  • 打赏
  • 举报
回复
看着这是win32 编程吧,代码有点堆砌, 逻辑改改,
lfxiansheng 2017-12-12
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
[quote=引用 11 楼 lfxiansheng 的回复:] [quote=引用 10 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 lfxiansheng 的回复:] 4楼的, 《Windows核心编程》 好厚的一本,关于我问题中的消息处理在哪里啊?帮忙定位一下吧。。。
带着自己遇到的问题看《Windows核心编程》中相关章节。[/quote] 我已经把书从第一页看完第九章了:用内核进行线程同步了,还是没有找到解决方法; 难道我看岔了吗?没发现解决方法。。。[/quote] 那就换《深入浅出MFC》[/quote] 这本书我看过的,没有这方面的内容,我准备自己去实现CListCtrl里的滚动条功能;
赵4老师 2017-12-11
  • 打赏
  • 举报
回复
引用 11 楼 lfxiansheng 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 lfxiansheng 的回复:] 4楼的, 《Windows核心编程》 好厚的一本,关于我问题中的消息处理在哪里啊?帮忙定位一下吧。。。
带着自己遇到的问题看《Windows核心编程》中相关章节。[/quote] 我已经把书从第一页看完第九章了:用内核进行线程同步了,还是没有找到解决方法; 难道我看岔了吗?没发现解决方法。。。[/quote] 那就换《深入浅出MFC》
lfxiansheng 2017-12-11
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 lfxiansheng 的回复:] 4楼的, 《Windows核心编程》 好厚的一本,关于我问题中的消息处理在哪里啊?帮忙定位一下吧。。。
带着自己遇到的问题看《Windows核心编程》中相关章节。[/quote] 我已经把书从第一页看完第九章了:用内核进行线程同步了,还是没有找到解决方法; 难道我看岔了吗?没发现解决方法。。。
赵4老师 2017-11-28
  • 打赏
  • 举报
回复
引用 5 楼 lfxiansheng 的回复:
4楼的, 《Windows核心编程》 好厚的一本,关于我问题中的消息处理在哪里啊?帮忙定位一下吧。。。
带着自己遇到的问题看《Windows核心编程》中相关章节。
lfxiansheng 2017-11-28
  • 打赏
  • 举报
回复
我知道用settimer可以克服拖动CListCtrl里面滚动条时卡住的问题,但是对于拖动标题栏或者按住标题栏内最小 最大化按钮时,同样是有问题的;所以我在想有没有彻底解决这些问题的方法,这些问题都是由于dispatchmessage发送出去的消息都要等待返回,drag and drop;难道就没有简单的方法能够克服上述缺点的吗????
zgl7903 2017-11-25
  • 打赏
  • 举报
回复
那就不要在主线程中等待事件, 启动一个定时器去检测采集和处理事件, 等待超时参数设为0, 等待立即返回
lfxiansheng 2017-11-25
  • 打赏
  • 举报
回复
while (PeekMessage(& 修改为 if(PeekMessage(& 试试看 还会有其他问题的,消息一次取一个,很容易死掉,以前我是用if的,用while一次把所有消息都取完是最好的,不然效率太低!! 问题是在dispatchmessage上,他是同步函数,所以要等待消息处理完之后返回;因为拖动标题栏要等待鼠标放掉,一个拖动动作才算完成,我用拦截鼠标拖动标题栏的消息,自己实现拖动窗口的功能克服了这个问题;我想用同样的办法消除,鼠标点击最小,最大化按钮不放,和鼠标点住CListCtrl里面的滚动条不放导致界面不能更新的问题,发现我无法判断鼠标具体点击滚动条的什么部位,如是滚动条的左右两边的箭头,滚动条滑块还是滚动条空白处;没有函数和参数可以得到这个信息;因为CListCtrl里面的滚动条不是CScrollBar对象,是自绘的滚动条,所以GetScrollBarCtrl函数得到的是空指针;我也知不道怎么样得到鼠标是点击了最小化最大化按钮;请问大神有办法解决吗?
zgl7903 2017-11-25
  • 打赏
  • 举报
回复
while (PeekMessage(& 修改为 if(PeekMessage(& 试试看
lfxiansheng 2017-11-24
  • 打赏
  • 举报
回复
4楼的, 《Windows核心编程》 好厚的一本,关于我问题中的消息处理在哪里啊?帮忙定位一下吧。。。
赵4老师 2017-11-23
  • 打赏
  • 举报
回复
《Windows核心编程》
sevancheng 2017-11-23
  • 打赏
  • 举报
回复
MsgWaitForMultipleObjects 你要用这个
lfxiansheng 2017-11-17
  • 打赏
  • 举报
回复
IsDialogMessage 本身也是同步的,一样会阻塞的啊!我试了一下,结果也是一样的
Eleven 2017-11-17
  • 打赏
  • 举报
回复
Note that the application is responsible for retrieving and dispatching input messages to the dialog box. Most applications use the main message loop for this. However, to permit the user to move to and to select controls by using the keyboard, the application must call IsDialogMessage. For more information, see Dialog Box Keyboard Interface.看看是不是这个的影响~

15,472

社区成员

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

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