SetTimer(1,20,NULL);
如果OnTimer中的语句在20毫秒内执行不完,
这个时候下一个定时又来了,会出现什么情况?

解决方案 »

  1.   

    应该还是会执行下一次操作吧?
    如果ontimer里面用到了什么资源可能就会造成资源冲突
      

  2.   

    我就是在实际编程中遇到了这样的情况
    现在的现象好像是,如果OnTimer处理函数用的时间太长,比如超过20毫秒,下一次就不会处理。
    OnTimer()
    {
        nnnn++;
        TRACE("%d",nnnn);
    }
    如果OnTimer中只有这两句,可以看在在大约1秒中的时间中,nnnn增加到了50多,
    但是如果在TRACE后面加上其他语句(读写AD卡,数据处理,图形显示)后,
    nnnn的值就明显小于预期。
    我现在不敢肯定,希望大家有经验的给个确切答案。
      

  3.   

    这种情况下用TRACE会有问题,可能显示的不是当前值
      

  4.   

    下一个一定会被响应,我在做这种速度较高的定时器时一般采用下面方法:........SetTimer(1,20,NULL);//开启定时器........//////////////////////////////////////////////..........OnTimer(UINT nIDEvent) 
    {
      KillTimer(nIDEvent);//先关掉
      
      .........//处理  SetTimer(nIDEvent,20,NULL);//重新开始
    }...........
      

  5.   

    Timer消息比较特殊,在消息队列中如果已经有,则不会再产生。
         至于OnTimer()函数,Window的消息机制本生会控制它同步的。
      

  6.   

    你可以设置一个一秒为间隔的时钟,在omtimer()里写入(AfxMessageBOx("OK")
    你不去管消息筐,你会发现这个消息框会原来越多,说明什么问题呢?:)
    另外你也可以作个试验,会发现omtimer函数没有处理完是不会处理其他的比如按钮消息等,
    这个原因我想是由于在硬件层时钟中断级别高于软件中断的缘故吧
      

  7.   

    我想给你一个比较准确的答案:就是settimer这个函数不能精确的定时,当队列中有Timer消息时,它不会生成另一个,就像多个WIN_PAINT消息会合并为一个一样
      

  8.   

    yg_xh(果皮) 说的对。据我所知是这样的。
      

  9.   

    SetTimer()会产生消息,这是会定时来的,不会因为别的原因而改变。
      

  10.   

    to:weilaibushimeng(袁哲) 
       你在Ontimer调用MessageBox时消息框之所以会不断的弹出来,并不能说明窗口能同时处理多个Timer消息,而是因为你在弹出一个消息框以后,消息框本身又是一个窗口,也就是说接下来的时间消息其实是你弹出来的哪个对话框在处理.  在一个消息线程,不管什么消息处理函数,在没有处理完之前都不会去处理其他的消息.
      

  11.   

    最简单的测试方法,在ontimer事件中吸先让其跳出一个对话框,再写一个死循环函数。如果对话框不停的出现则说明程序确实是按定时器时间触发的。如果只有一个框则说明是要等前一个周期执行完后才会执行下一个周期。楼主可以试验一下。
      

  12.   

    我试过了,定时器是单线程的.settimer定时器后,他的函数会执行到头的
      

  13.   

    shenghuafen(飞鸟)  的测试方法是不行的,  
        你可以定义一个全局变量, 在OnTimer中加一,然后当变两等于的时候就退出程序, 
    再在Ontimer中写一个死循环,看看程序是否会退出
      

  14.   

    shenghuafen(飞鸟)  的测试方法是不行的,  
        你可以定义一个全局变量, 在OnTimer中加一,然后当变量等于2的时候就退出程序, 
    再在Ontimer中写一个死循环,看看程序是否会退出