2012-07-21 43 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

我以前有同样的问题,在相同的代码。创建一个计时器,它可以生成一个逗号分隔的进程列表为一个宽字符串,并在变量中使用您的函数搜索进程名称。