Delphi - 循环消耗CPU

use*_*695 1 delphi loops cpu-usage

在我的代码中,我有一个while循环.

说实话,我并不需要它,甚至是一个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;
Run Code Online (Sandbox Code Playgroud)

结束;

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; 
Run Code Online (Sandbox Code Playgroud)

Mar*_*dor 6

正如您在评论中所说,您想检查注册表更改,因此,您的方法并不好.使用计时器连续检查不是解决方案.Windows API定义了一组与注册表监视相关的特殊功能/挂钩.在进行更改时,他们会被解雇.您的应用只需等待0%CPU时间的更改.

请看一下这个示例:监控注册表更改

为注册表监视定义专用线程以防止应用程序冻结.

此外,如果注册表更改至关重要,也许可以运行您的app/part或它作为Windows 服务.

[编辑]

关于应用程序/进程监视,您应该获得运行进程的句柄.如果它没有退出,则启动它,获取Handle,并为您的应用程序使用WaitForSingleObject.一些代码的灵感.WaitForSingleObject只是等待应用程序终止.如果不控制终止,则可以重新启动它(退出代码).

另外,如果您想禁止用户停止它,请考虑将您的应用程序作为Windows服务运行.它将以系统特权运行,如果用户没有管理员权限,Windows将拒绝停止您的应用程序.

  • User1512695,如果你不间断地调用ProcessExists**,你如何期望CPU消耗(至少一个核心)低于100%** (2认同)
  • 编写注册表转储也是一项巨大的操作,当然会占用大量的cpu资源,我认为即使是2秒的间隔也可能过于频繁. (2认同)