定时、循环处理某项操作时让间隔时间更准确的方法

我们在写C++代码时,有些情况会考虑操作超时的问题,比如循环读取某个设备的值,如果在指定的时间内读不回全部数据就认为是超时。

最直接的做法是:
for (int i = 0; i < 20; ++i)
{
...... // ①读取操作,成功则直接跳出循环
Sleep(50);  // 每次读失败后延时50毫秒,最多读20次:50ms*20=1000ms
}

这里我们忽略了①处所用的时间,假设读失败的操作用了60ms,那总超时时间应该是(60+50)*20=2200ms,本应该是1秒就超时的,结果用了2.2秒才超时,这会影响到后续的应用。

为了让时间间隔更准确,我们引入了GetTickCount()这个API函数:
int nStart = GetTickCount();
do {
...... // ②读取操作,成功则直接跳出循环
Sleep(50);  // 每次读失败后延时50毫秒
} while (GetTickCount() - nStart < 1000);

这个方法在统计时间时计算了②处所用的时间,循环不断的执行②操作,失败时延时50ms,如果时间超过1秒则跳出循环,这样超时的最长时间是(假设②用了60ms):(60ms+50ms)+999ms=1099ms,这里999ms上一次进入循环的最大值。

Tags:

Leave a Reply


提醒: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。请务必注意user必须和评论者名相匹配(大小写一致)。