經過調整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時間片