这是必须在XP上运行的代码,所以没有GetTickCount64,并且在49天后应该正确地处理值的包装。还能改进吗?
// DWORD timeoutMs is a given parameter.
DWORD beginMs = (timeoutMs == INFINITE ? 0 : ::GetTickCount());
DWORD endMs = beginMs + timeoutMs; // unsigned arithmethic is Mod(MAX+1)
DWORD currentMs;
// Create Process, omitted for brevity
while ((waitResult = ::WaitForSingleObject(pi.hProcess, DEFAULT_WAIT_MS)) == WAIT_TIMEOUT)
{
if (timeoutMs != INFINITE)
{
bool timeoutReached = false;
currentMs = ::GetTickCount();
if (beginMs <= endMs) // normal case
{
if (currentMs > endMs)
{
timeoutReached = true;
}
}
else // special case: tick count wrapped around after 49 days uptime
{
if (currentMs < beginMs && currentMs > endMs)
{
timeoutReached = true;
}
}
if (timeoutReached)
{
::TerminateProcess(pi.hProcess, 0);
break;
}
}
}发布于 2016-05-30 11:02:31
无符号减法(和自动mod 2^32)总是给出currentMs - beginMs == elapsedMs,即使是beginMs > currentMs,只要实际运行的时间不溢出滴答计数(它不大于49天)。
因此,您可以用以下代码替换原始代码:
DWORD beginMs = GetTickCount();
// Create Process, omitted for brevity
while ((waitResult = WaitForSingleObject(pi.hProcess, DEFAULT_WAIT_MS)) == WAIT_TIMEOUT) {
if (timeoutMs != INFINITE) {
DWORD currentMs = GetTickCount();
bool timeoutReached = currentMs - beginMs > timeoutMs;
if (timeoutReached) {
TerminateProcess(pi.hProcess, 0);
break;
}
}
}您甚至可以更进一步,消除变量currentMs和timeoutReached:if (GetTickCount() - beginMs > timeoutMs) {...
https://codereview.stackexchange.com/questions/128879
复制相似问题