2013-12-13 26 views
0

我創造,我需要運行然後移動創建在Delphi使用的GetTickCount

procedure firstTimeRun(const document: IHTMLDocument2); 
var 
    fieldValue : string; 
    StartTime : Dword; 
begin 
    StartTime := GetTickCount(); 
    WebFormSetFieldValue(document, 0, 'Username', '*******'); 
    WebFormSetFieldValue(document, 0, 'Password', '*******'); 
    WebFormSubmit(document, 0); 
if (GetTickCount() >= StartTime+ 600000) then 
begin 
    SecondRun(); 
end; 
end; 

我的問題是,當我到達if語句,它會檢查看到之前等待10分鐘的過程等待這是不是真的,並繼續前進,我如何讓它留下來,等到聲明是真的?

+2

你不能使用TTimer嗎? –

+1

請注意,如果您在主線程中執行此操作,它將阻止UI(10分鐘!)。如果是這樣,不要使用建議的方式,也不要試圖通過調用「Application.ProcessMessages」來「修復」該塊。 – TLama

回答

5

天真的答案是,你需要一個while循環:

while GetTickCount() < StartTime+600000 then 
    ; 
SecondRun(); 

或許更容易地閱讀,一個repeat循環:

repeat 
until GetTickCount() >= StartTime+600000; 
SecondRun(); 

但是,這是錯誤的方式來做到這一點。你將運行處理器10分鐘,並且什麼都不做。而且我對如果你的系統已經運行了49天,然後你會打開GetTickCount環繞並且測試的邏輯有缺陷這一事實說了話。

操作系統有一個旨在解決您的問題的功能,它被稱爲Sleep

Sleep(600000); 

這會阻止調用線程達到指定的毫秒數。因爲線程是塊,所以線程在等待時不會消耗CPU資源。

這將使調用線程無響應,所以它通常是在後臺線程中執行的操作,而不是應用程序的主線程。

+0

我一直在睡覺,但有接縫是很多人猶豫要使用它,這就是爲什麼我問。 – NicholasSPI

+0

那麼,這是非常廣泛的誤用。但是,如果你確實需要等待很長時間,並且想要阻止,那就完美了。在不希望運行消息隊列的情況下,在後臺線程中保持活動計時器通常很有用。在你的情況下,避免睡眠,但用繁忙的循環代替它同樣會提高不喜歡睡眠的人的憤怒。我個人是一個嗜睡者,但只有當它被誤用時。 –

+0

人們錯誤使用它的原因是因爲他們只是想解決某些問題,並且不想考慮在Windows應用程序中阻止調用的問題的整個上下文。 OP的問題表明他就是這樣一個人。 –