请问如果需要定时循环执行某操作,是在线程的while循环中用sleep好,还是在主界面线程里面用ontimer循环执行好?也请指教一下,在线程中一般使用什么方法进行定时比较好?

解决方案 »

  1.   

    可能我说的不清楚,我指的操作是一定要写在一个新线程里的,现在的问题是要定时循环执行,到底是在主界面线程里用ONTIMER循环启动线程好呢,还是在线程里进行定时好呢?如果在线程里进行定时,我目前知道的方法是在while循环里用sleep,请问还有什么更好的方法?在线程里能不能用ontimer?
      

  2.   

    用wm_timer吧,简单点又可以实现你的要求。
      

  3.   

    在线程里面好,不过不用Sleep,因为程序运行需要时间,所以不精确,应该用以下方法,可精确到1毫秒
    //以下是100毫秒一次的精确定时timeBeginPeriod(1);
        
        const DWORD dwFrameRate = 10;
    static DWORD dwFrameNum = 0;
        
        DWORD dwFramePeriod = 1000 / dwFrameRate;
        DWORD dwStartTime = timeGetTime();
        
       for ( ;; ) {
            
            DWORD dwTimeThisFrame = dwStartTime + ((++dwFrameNum * 1000) / dwFrameRate);
            long lWaitTime = dwTimeThisFrame - timeGetTime();
            
            if (lWaitTime < 0) {
                continue;
            }
            
            DWORD rc = WaitForSingleObject(m_hQuitEvent, (DWORD)lWaitTime);
            if (rc == WAIT_OBJECT_0)
    {
                break;
            }  
             
            //具体的处理代码
                        }   
        
        timeEndPeriod(1);
      

  4.   

    谢谢。如果在主线程中用wm_timer循环启动子线程,只能适用于线程只有一个定时操作的情况,如果那个子线程中有两个需要定时执行的操作,如何解决呢? 如果非要在线程中进行定时,用什么方法好?
      

  5.   

    回broadoceans(broadoceans):
    谢谢你的指教!你的代码收下了!我目前的情况并不是需要很精确(定时大概10秒以上,秒级就够了),我只是关系资源占用问题和程序长时间运行后的定时是否仍然能达到要求(误差不会因为运行时间的延长而增大)
      

  6.   

    主线程中用wm_timer循环启动子线程,那你不能开两个同样优先级的线程,分别处理两个需要定时执行的操作,保持两个线程同步不行吗??
      

  7.   

    如果不需要精确定时,用Sleep最好了
      

  8.   

    主线程中用wm_timer循环启动子线程,那你不能开两个同样优先级的线程,分别处理两个需要定时执行的操作,保持两个线程同步不行吗??
    -------------------------
    除非是UI线程,工作者线程不能启动定时器。因为没有主窗口!