Cxxxxx::func()
{
......
settimer(1,100);
......
}void Cxxxxx::OnTimer(UINT nIDEvent) 
{
if(1==nIDEvent)
{
func2();//这个函数执行会超过100毫秒时间
} if(2==nIDEvent)
{
func3();
}}以上代码中在func()中启动了定时器1,当定时器时间到到时在OnTimer()中会去执行1号定时器的处理函数func2(),假设func2()需要执行很长时间,那么当1号定时器第二次timerout时,是否还会进入到OnTimer()中的func2(),还是等待前一个func2()执行完在进入,又或者直接丢掉这个timerout事件?另外,如果在执行func2()的时候,2号定时器时间到,情况又会如何?

解决方案 »

  1.   

    这个问题和按键一样。当系统在执行其它操作时(这个操作耗时较长),按下一个键一段时间后放开,可以产生多个WM_KEYDOWN消息和一个WM_KEYUP消息放入消息队列,当执行到WM_KEYDOWN消息处理时系统会将多个WM_KEYDOWN系统合并为一个WM_KEYDOWN系统。同理,定时器也是一样,它的优先级也比较低,如果系统在处理其它事件的时间较长,消息队列里会堆积多个WM_TIMER消息。当下次处理的时候也会只产生一个WM_TIMER消息。如果还是不清楚的话你可以看《windows程序设计》里定时器这一章,讲解得很详细。
      

  2.   

    定时器的优先级很低,按照你说的那种情况,设置的间隔时间很短,但是OnTimer里的函数却要执行很长时间的话,中间的都会被舍弃了。