如何在Inno Setup中获得时差?

时间:2012-12-04 09:57:37

标签: inno-setup

我想编写一个带有超时的while循环,如下所示...如何在Inno Setup中编写?

InitialTime = SystemCurrentTime ();

Timeout = 2000; //(ms)

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

谢谢!

1 个答案:

答案 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天),因为它会很快超时当溢出发生时(可能在所需的等待之前)。