高手给讲解一下消息队列的问题
首先我的疑问是消息队列放在哪?内存中?
然后我的程序自定义了一个消息,给一些窗口发消息,窗口做了很多操作(耗时比较长),然后本次没操作完呢,下次的就又来了,这样会一直积累下去,到最后把窗口耗的不能刷新了,消息队列还没丢失一直在,最后不发消息了之后,过了有20分钟后,程序才把所有的消息处理完,程序才恢复正常。请问怎么解决?
[解决办法]
把刷新算法优化一下,不要每次数据更新都刷新,攒到一定数量一起刷新,其实即便在窗口函数里有大量的计算可能也不至于速度太慢,主要是系统更新窗口显示的时候比较慢,如果总是不停的在刷新会有这种情况出现
[解决办法]
static BOOL busy = FALSE;
switch(message):
.....
case CUSTOM_MESSGAE:
if(busy) break;
busy = TRUE;
....
.... // do some thing
busy = FALSE;
break;
[解决办法]
主函数维护一个消息队列(MFC是app类)
得到消息后,把刷新消息push到一个队列里,另开一个线程,从队列里取消息,然后再刷新。
如果刷新速度实在太慢,严重影响了界面,则应该反思一下,是否该限制发消息的频率。
[解决办法]
很多实时软件的刷新也不是实时的,比如每十条或者几秒钟以内没有刷新过就刷新,为每一条信息走一遍整个的刷新过程是非常耗资源的。
不是信息来的速度大于你记录处理的速度,如果是那样那就得换电脑了,而是显示过程跟不上信息更新的速度,只能尽量减少显示过程浪费的时间。
[解决办法]
如果只是要维持窗口响应,用一个线程在后台处理,实际处理完了再发消息给主线程,这样就可以防止主窗口不响应了,如果是嫌总的处理时间太长,只能优化处理代码,其次就是升级硬件了。
[解决办法]
可能性太多了,反正多从自己的代码身上找原因吧
[解决办法]
SendMessage
[解决办法]
QS_PAINT消息的优先级仅仅比QS_TIMER优先级高,像楼主这种情况,消息处理耗时太长,进而影响界面刷新,是否考虑
用WM_TIMER消息来处理。
[解决办法]
看看程序运行一段时间之后的内存消耗什么的,是不是你程序里面有的地方处理了之后没有释放,积累太多了。
[解决办法]
那就需要优化你的代码,减少其中重复与冗余的代码部分。
或者你在处理接收到的消息时,采用另外一个线程处理。
这样就减少了对主线程的负担,刷新就不会很慢了
[解决办法]
你的消息有多快啊?现在的硬件,处理100ms一个消息是绰绰有余的。
[解决办法]
楼主的问题,如果用线程,应该不难解决
[解决办法]
SendMessage和PostMessage两个函数有些不一样,
得到的结果有可能会延时一段时间,
一个是发出的消息立即执行,
一个则是只负责投递,不管消息队列里有没有消息。
建议楼主还是另开线程执行吧。
[解决办法]
建立一个线程或全局函数用于消息的获得和传递等处理,然后在主线程处理其他运算(一个或多个耗时较长的函数)的过程中适时调用这个函数.不让耗时函数阻塞消息的处理.