求教多线程程序界面无响应的问题

郑再鹏 2009-05-17 04:49:57
我的程序是个多线程的,底层多个线程采集数据,中间一个线程保存数据,并发消息给主界面通知他显示数据,界面线程(使用CWinAPP默认的主线程)显示数据。
平时程序跑得没问题,但是只要是长时间(连续跑10小时左右)测试,就会出现界面无响应的问题,但这时候数据采集线程,分发线程都仍在正常工作,只是发送给界面的让界面更新的消息(自定义消息,即WM_USER + N)无法被界面收到。不知道是为什么。但可以明确没有内存泄漏。

请教各位高手给点思路,一般有什么可能会造成消息无法被响应?消息队列乱了吗?还是别的原因?如何判断?

另外,程序中有peekmessage方法,传入最后的参数为PM_REMOVE,但是有while循环把peek到的message给translate和dispatch的操作。
...全文
483 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
郑再鹏 2009-05-19
  • 打赏
  • 举报
回复
唉,经过昨晚的奋战,终于找到原因了,原来是很简单的一个问题导致的,并不是什么高深的原因。某界面中在长时间测试后会进入一个if/else循环中的else(由业务决定的),而由于疏忽,else中没有对一个计数器做增加操作,进而产生了死循环,导致主线程被挂死,从而导致发到主线程消息队列的消息无法被处理,包括WM_PAINT、WM_TIMER等,也就出现了界面白屏、Timer不执行的问题。同时由于后台线程一直在向主线程发消息要求界面更新,由于主线程来不及处理,也导致了消息队列满了,出现1816错误。
代码走查不细致啊!
感谢各位的参与!结贴!
XU33149715 2009-05-18
  • 打赏
  • 举报
回复
高深,学习
瓶盒 2009-05-18
  • 打赏
  • 举报
回复
可能是传送线程发消息的速度比接收线程处理消息的速度快些。
郑再鹏 2009-05-18
  • 打赏
  • 举报
回复
找到为什么了,但是不知道哪里引起的以及解决办法。
我长时间测试后发现PostMessage返回是失败,GetLastError返回的错误值是1816,"配额不足,无法处理此命令",应该是消息队列满了。但是为什么主线程消息队列会满了呢?
郑再鹏 2009-05-18
  • 打赏
  • 举报
回复
这种方法以前我们用,后来发现开新的线程去替换主线程对界面的操作,容易引起异常。因为主线程也会对界面进行刷新等操作,有可能跟新的线程冲突,尤其是在界面数据高速更新时。
mo229mo 2009-05-18
  • 打赏
  • 举报
回复
可以为界面响应创建单独的线程
郑再鹏 2009-05-17
  • 打赏
  • 举报
回复
那有哪些种原因可能导致这样的现象呢?请高手指点。
  • 打赏
  • 举报
回复
消息队列应该不会乱吧

15,471

社区成员

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

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