【问题标题】:Delphi - While Loop Consuming CPUDelphi - While 循环消耗 CPU
【发布时间】:2012-07-20 09:02:43
【问题描述】:

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

说实话,我什至不需要它是一个 while 循环,只是一个 continue 循环,所以在程序开始时我将一个布尔变量设置为 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;

结束;

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; 

【问题讨论】:

  • 可能 ProcessExists() 返回 True,因此 Sleep() 永远不会被执行
  • 函数 processExists(exeFileName: string): Boolean; var ContinueLoop: BOOL; FSnapshotHandle:THandle; FProcessEntry32:TProcessEntry32;开始 FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);结果:=错误; while Integer(ContinueLoop) 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) 或 (UpperCase(FProcessEntry32.szExeFile) =
  • UpperCase(ExeFileName))) 然后开始 Result := True;结尾; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);结尾;关闭句柄(FSnapshotHandle);结束;
  • 您好,如果您想添加一些代码,您可以编辑您的问题。无论如何,我认为有人会添加一个完整的答案。顺便说一句,你想达到什么目的?它是某种正在执行的服务吗?
  • 看来你只需要安装一些杀毒软件。更改注册表是完全正常的。几乎所有程序都这样做。而且这样的轮询不是检测注册表更改的方法。

标签: delphi loops cpu-usage


【解决方案1】:

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

看看这个样本:Monitoring Registry Changes

为注册表监控定义一个专用线程以防止应用程序冻结。

另外,如果 reg 更改很关键,则运行您的应用程序/部件或将其作为 windows service 可能是有意义的。

[编辑]

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

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

【讨论】:

  • 你们在这里错过了重点,大声笑.. IDC 关于注册表监控..我只是想知道如何使用 While 循环降低 CPU 消耗.. 谢谢
  • User1512695,如果您不间断地调用 ProcessExists,您如何期望 CPU 消耗(至少一个核心)低于 100%
  • 另外写一个注册表转储是一个巨大的操作,当然会吃掉很多cpu资源,我认为即使是2秒的间隔也可能过于频繁。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多