在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時間片

相關文章
相關標籤/搜索