在WINDOWS下进行定时控制的时间偏差

经过调整WaitForMultipleObjects的超时参数进行计时控制,在windows多线程环境下实现定时处理,发现总存在必定的偏差。windows

在WINDOWS xp系统 x86 32位系统下测得只有在250ms的整数倍的状况下能够精肯定时,多线程

其余时间间隔都有从0-15ms不等的偏差测试

指望计时间隔 实际获得的计时间隔 偏差
50ms 63ms 13ms
60ms 63ms 3ms
70ms 78ms 8ms
80ms 94ms 14ms
90ms 94ms 4ms
100ms 110ms 10ms
110ms 125ms 15ms
120ms 125ms 5ms
130ms 141ms 11ms
140ms 141ms 1ms
150ms 156ms 6ms
160ms 172ms 12ms
160ms 172ms 12ms
170ms 172ms 2ms
180ms 188ms 8ms
190ms 203ms 13ms
200ms 203ms 3ms
210ms 219ms 9ms
220ms 235ms 15ms
230ms 235ms 5ms
240ms 250ms 10ms
250ms 250ms 0ms
500ms 500ms 0ms
750ms 750ms 0ms
1000ms 1000ms 0ms
1250ms 1250ms 0ms

 

测试用例伪代码ui

 

    for (;;)
    {
        nWaitTime=50;//60,70,80,...
        int nWaitReturn = WaitForMultipleObjects(2,phEvents, FALSE, nWaitTime);
        switch(nWaitReturn)
        {
        case WAIT_TIMEOUT:
            //处理定时事件
            {
                 write_cur_time_to_ui();//spa

                 proc_timer_event();
            }
            break;操作系统

       case SOME_EVENT:线程

           {事件

                  proc_some_event();ip

           }ci

          break;

       }

  }     

 

缘由揣测:应该是WaitForMultipleObjects在等待过程当中会有来回的线程切换。在XP x86机器上,线程切换的时间片大小在0-15ms之间进行波动。

WINDOWS系统是一个非实时系统,在多线程环境下用软件实现精确的定时功能很难。WINDOWS的时间片计算机制致使只能有250ms的定时精确度。

综上,对于对时间有严格要求,特别是须要精确到毫秒级的应用,建议采用实时操做系统,分时系统是不可能达到控制精度的。

 

关键字:实时操做系统,分时操做系统,时间精确控制,WINDOWS时间片

相关文章
相关标签/搜索