WM_TIMER冲突处理[转载至91program]

来源:互联网 发布:mysql创建表格 编辑:程序博客网 时间:2024/05/18 00:03

WM_TIMER响应冲突:即多个WM_TIMER同时到达时的处理
首先,WM_TIMER这个消息的优先级很级,类似的还有WM_PAINT消息。只有在消息队列里面没有其他消息的时候,才会执行这两个消息。
以下是EVC4帮助中的原话:The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions retrieve this message only when no other higher-priority messages are in the thread’s message queue.

这段时间,在CSDN的 硬件/嵌入开发>嵌入开发(WinCE)中,就在讨论TIMER这个消息,具体的内容见:

 


http://topic.csdn.net/u/20071205/10/f97d8fed-3ea9-4a7f-a2e0-3b707f4ca264.html

OnTimer会丢失定时消息,但是用回调不会丢失,为什么?

用例子说明:
EVC4中创建一个对话框工程,一个按钮按下,执行如下代码:
::SetTimer( 0, 1, 1000, NULL );
::SetTimer( 0, 2, 1000, NULL );
即设置2个定时器,间隔都是1000ms

然后在OnTimer中如下处理:
switch( nIDEvent )
{
case 1:
::OutputDebugStringW( L"1" );
case 2:
::OutputDebugStringW( L"2" );
default:
;
}
在WinCE.Net测试时发现,只打印"2"

但如果使用回调,即按钮按下执行:
::SetTimer( 0, 1, 1000, (TIMERPROC)Tm1 );
::SetTimer( 0, 2, 1000, (TIMERPROC)Tm2 );

在回调函数Tm1和Tm2中也输出"1"和"2"
在WinCE测试,发现"1"和"2"都有输出


这说明什么问题呢? 是不是说,OnTimer消息处理,定时器消息会丢失,如果同一时刻有几个定时器消息同时到达的话,旧的被新的覆盖了;
如果使用回调,就不会丢失

但是,对于系统来说,定时器时间到后,都是给进程发消息的,不管进程中使用的是OnTimer处理还是回调处理
如果是这样,就是说进程内处理定时器消息时,回调处理不会丢失,使用窗口的消息处理函数(即OnTimer方式)会丢失

 

 

 

网上有这样一段话(不是权威):
[多个WM_TIMER同时到达时,WM_TIMER是会产生的,不过如果多个相同WM_TIMER排在一起,会被合并。]这个说法,符合上面帖子中实际测试得到的结果。
但是另一段话是这样的:
[消息队列里面不会载入多个WM_TIMER。WINDOWS会将消息队列只保留一个WM_TIMER,舍弃其他的WM_TIMER。] 但是没有说,对WM_TIMER消息是如何处理的!

所以,根据帖子中实测的结果与上述文字可以得到以下结论:消息队列里面不会载入多个WM_TIMER;如果多个相同WM_TIMER排在一起,会被合并执行最后一个WM_TIMER对应的功能。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/91program/archive/2007/12/06/1920851.aspxSetTimer, 用