我想编写一个带有超时的while
循环,如下所示...如何在Inno Setup中编写?
InitialTime = SystemCurrentTime ();
Timeout = 2000; //(ms)
while (!condition) {
if (SystemCurrentTime () - InitialTime > Timeout) {
// Timed out
break;
}
}
谢谢!
答案 0 :(得分:5)
为了简化Inno设置,您可以使用GetTickCount
来电。
GetTickCount函数的分辨率仅限于系统计时器的分辨率,通常在10毫秒到16毫秒的范围内。
因此,它不会在2000毫秒(或任何你想要的值)完全超时但接近足以接受。
您必须注意的其他限制是:
经过的时间存储为DWORD值。因此,如果系统连续运行49.7天,时间将回绕到零。
在代码中,它显示如下:
[Code]
function GetTickCount: DWord; external 'GetTickCount@kernel32 stdcall';
procedure WaitForTheCondition;
const
TimeOut = 2000;
var
InitialTime, CurrentTime: DWord;
begin
InitialTime := GetTickCount;
while not Condition do
begin
CurrentTime := GetTickCount;
if ((CurrentTime - InitialTime) >= TimeOut) { timed out OR }
or (CurrentTime < InitialTime) then { the rare case of the installer running }
{ exactly as the counter overflows, }
Break;
end;
end;
上述功能并不完美,在罕见情况中,当计数器溢出时运行(一旦机器连续运行49.7天),因为它会很快超时当溢出发生时(可能在所需的等待之前)。