3

我想写一个while像下面这样的超时循环......如何在 Inno Setup 中写这个?

InitialTime = SystemCurrentTime ();

Timeout = 2000; //(ms)

while (!condition) {    
    if (SystemCurrentTime () - InitialTime > Timeout) {
    // Timed out
       break;
    }
}

谢谢!

4

1 回答 1

6

为了简化 Inno Setup,您可以使用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天连续运行一次),因为一旦发生溢出它就会超时(可能在所需的等待之前) )。

于 2012-12-05T19:35:35.240 回答