3

次のようなタイムアウト付きのループを書きたいのですがwhile...InnoSetupでこれを書く方法は?

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 に答える