用例子说明: 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方式)会丢失 |
联系客服