经过调整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时间片