2012-12-04 88 views
3

我想寫一個while循環與超時如下...如何在Inno安裝程序中寫入此?如何在Inno Setup中獲得時差?

InitialTime = SystemCurrentTime(); 

Timeout = 2000; //(ms) 

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

謝謝!

回答

5

爲了簡化Inno Setup,您可以使用GetTickCount調用。

GetTickCount函數的解析度僅限於系統計時器的分辨率,通常在10毫秒到16毫秒的範圍內。

因此,它不會在2000毫秒(或任何你想要的值)時精確超時,但足夠接近以便被接受。

你必須知道的其他限制是:

所經過的時間存儲爲DWORD值。因此,如果系統連續運行49.7天,時間將回到零。

在代碼中,它顯示是這樣的:

[Code] 
function GetTickCount: DWord; external '[email protected] 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天一次機器持續運行),因爲一旦發生溢出就會超時(可能在所需等待之前)。

+1

嗨Jachguate,它運行良好。真的感謝! –