次のようなタイムアウト付きのループを書きたいのですがwhile
...InnoSetupでこれを書く方法は?
InitialTime = SystemCurrentTime ();
Timeout = 2000; //(ms)
while (!condition) {
if (SystemCurrentTime () - InitialTime > Timeout) {
// Timed out
break;
}
}
ありがとう!
次のようなタイムアウト付きのループを書きたいのですがwhile
...InnoSetupでこれを書く方法は?
InitialTime = SystemCurrentTime ();
Timeout = 2000; //(ms)
while (!condition) {
if (SystemCurrentTime () - InitialTime > Timeout) {
// Timed out
break;
}
}
ありがとう!
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日ごとに継続的に実行されている場合)。オーバーフローが発生するとすぐに(おそらく目的の待機前に)タイムアウトするためです。 )。