我们在写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: C/C++