如何在Inno Setup中获得时差?

健榮 *_*榮 陳 3 inno-setup

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

InitialTime = SystemCurrentTime ();

Timeout = 2000; //(ms)

while (!condition) {    
    if (SystemCurrentTime () - InitialTime > Timeout) {
    // Timed out
       break;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

jac*_*ate 5

要在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;
Run Code Online (Sandbox Code Playgroud)

上面的函数并不完美,在极少数情况下,计数器溢出时运行(一旦机器连续运行49.7天),因为一旦发生溢出就会超时(可能在所需的等待之前) ).