我的程序里有多个要定时执行的函数,听说SetTimer不是十分可靠,当OnTimer函数还没有返回的时候,其它的WM_TIMER消息就会丢失,是这样的吗?
如果是的话,我该怎么设计?
还有,使用OnTimer消息处理函数和自己定义的回调函数有什么区别?

解决方案 »

  1.   

    CreateWaitableTimer/SetWaitableTimer/CancelWaitableTimer
      

  2.   

    //回调函数一般用于事件触发或条件触发,SetTimer用于定时触发。SetTimer(1,1000,NULL); //一秒钟执行一次
    SetTimer(2,60000,NULL); //一分钟执行一次
    SetTimer(3,3600000,NULL); //一小时行一次
    void CDlg_Test::OnTimer(UINT_PTR nIDEvent)
    {
    if(nIDEvent==1) { KillTimer(1); test1(); } //只执行一次
    if(nIDEvent==2) { if(!run) KillTimer(2); test2(); } //run为false终止执行
    if(nIDEvent==3) { test3(); } //始终执行
    CDialogEx::OnTimer(nIDEvent);
    }
      

  3.   

    使用回调函数,也可以实现SetTimer()的功能。
    SetTimer() 本身,其实也是使用了一个回调函数来通知计时器。
      

  4.   

    或者开线程,在线程中Sleep计时
      

  5.   

    1,如果时间间隔已到,但是上次执行的OnTimer函数还没有返回?这时系统会怎么处理,等待上一次执行完?终止上次正在运行的函数?还是另起一个线程执行这个函数?还是其它的方法?
    2,你是指的在一个线程中用死循环,然后sleep一定时间吗?
      

  6.   

    线程定时器。你可以想有多少定时器就有多少。sleep多少看你精度。不用sleep也行,用内核信号量也成
      

  7.   

    不会丢失,会排队,要前面一个Timer完成后,后面一个才执行。
      

  8.   


    SetTimer时间到了以后,发送消息到线程的消息队列,
    线程中只有一个消息处理完成后,后面的消息才会得到处理
      

  9.   

    谢谢各位指教,一楼给的那三个函数我刚看了一下用法的,还没有试验,不过既然SetTimer可行,我就准备用SetTimer。结账了.