2012-07-21 74 views
1

在我的代碼中我有一個while循環。德爾福 - while循環消費CPU

說實話,我不需要它甚至是一個while循環,只是一個繼續循環,所以在過程開始時,我將一個布爾變量設置爲true,然後使用While BoolVar。

這是在控制檯應用程序中不是表單。

循環使應用程序消耗100%的使用量。

我正在使用睡眠(2000);在循環內。

如何降低CPU使用率。任何幫助是極大的讚賞。

while PerRunning do begin 
if ProcessExists('FileName.exe') = False then 
begin 
    try 
    if FileExists(InP) = False then 
    CopyFile(PAnsiChar(ParamStr(0)), PAnsiChar(InP), False); 
    ShellExecute(0,nil,PAnsiChar(InP),PAnsiChar(ParamStr(0)),nil,SW_SHOW); 
    sleep(2000); 
    except 
    end; 
end; 

end;

function processExists(exeFileName: string): Boolean; 
var 
    ContinueLoop: BOOL; 
    FSnapshotHandle: THandle; 
    FProcessEntry32: TProcessEntry32; 
begin 
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
    Result := False; 
    while Integer(ContinueLoop) <> 0 do begin 
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) 
     or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then begin 
     Result := True; 
    end; 
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
    end; 
    CloseHandle(FSnapshotHandle); 
end; 
+3

可能ProcessExists()返回True,所以Sleep()永遠不會執行 – 2012-07-21 07:29:04

+0

函數processExists(exeFileName:string):Boolean; var ContinueLoop:BOOL; FSnapshotHandle:THandle; FProcessEntry32:TProcessEntry32; 開始 FSnapshotHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); FProcessEntry32.dwSize:= SizeOf(FProcessEntry32); ContinueLoop:= Process32First(FSnapshotHandle,FProcessEntry32); 結果:=假;如果((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))= UpperCase(ExeFileName))或(UpperCase(FProcessEntry32),則Integer(ContinueLoop)<> 0 do begin 。szExeFile)= – user1512695 2012-07-21 07:32:17

+0

UpperCase(ExeFileName)))然後 開始 結果:=真; 結束; ContinueLoop:= Process32Next(FSnapshotHandle,FProcessEntry32); 結束; CloseHandle(FSnapshotHandle); 結束; – user1512695 2012-07-21 07:33:42

回答

6

正如您在評論中所說的,您想要檢查註冊表更改,所以您的方法並不好。 連續檢查使用定時器不是一個解決方案。 Windows API已經定義了與註冊表監視相關的一組特殊的函數/鉤子。當改變時他們被解僱。您的應用只需等待CPU時間爲0%的更改。

看看這個例子:Monitoring Registry Changes

定義註冊表監控專用線程,以防止應用程序凍結。

此外,如果reg更改非常關鍵,可能會讓您運行您的應用/部件或將其作爲窗口service

[編輯]

關於申請/過程監控,你應該運行的進程的句柄。如果它沒有退出,請啓動它,獲取Handle,然後WaitForSingleObject用於您的應用程序。一些code的靈感。 WaitForSingleObject只是等待應用程序終止。如果終止不受控制(退出代碼),您可以重新啓動它。

另外,如果您想禁止用戶停止它,請考慮將您的應用程序作爲Windows服務運行。它將以系統特權運行,如果用戶不具有管理員權限,Windows將拒絕停止您的應用程序。

+0

你們這裏錯過了點,大聲笑.. IDC關於註冊表監控..我只是想知道如何降低CPU消耗與同時循環.. 謝謝 – user1512695 2012-07-22 06:17:18

+2

用戶1512695,你如何預計CPU消耗(在如果您不間斷地調用ProcessExists **,則可以少於100%** – 2012-07-22 10:50:24

+2

還要編寫註冊表轉儲是一項巨大的操作,當然會佔用大量的cpu資源,我認爲即使是2秒的時間間隔可能太頻繁了。 – 2012-07-22 11:00:14

0

我以前有同樣的問題,在相同的代碼。創建一個計時器,它可以生成一個逗號分隔的進程列表爲一個寬字符串,並在變量中使用您的函數搜索進程名稱。