Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-While循环消耗CPU_Delphi_Loops_Cpu Usage - Fatal编程技术网

Delphi-While循环消耗CPU

Delphi-While循环消耗CPU,delphi,loops,cpu-usage,Delphi,Loops,Cpu Usage,在我的代码中有一个while循环 老实说,我甚至不需要它是一个while循环,只需要一个continues循环,所以在过程的开始,我将一个布尔变量设置为true,然后使用while BoolVar 这是在控制台应用程序中,而不是表单中 循环使应用程序消耗100%的使用率 我正在使用睡眠(2000);在循环内部 如何降低cpu使用率。非常感谢您的帮助 while PerRunning do begin if ProcessExists('FileName.exe') = False then be

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

老实说,我甚至不需要它是一个while循环,只需要一个continues循环,所以在过程的开始,我将一个布尔变量设置为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;
结束

函数processExists(exeFileName:string):布尔值;
变量
连续作业:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
开始
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);
ContinueLop:=Process32First(FSnapshotHandle,fpProcessEntry32);
结果:=假;
当整数(ContinueLoop)0开始时
如果((大写(ExtractFileName(FProcessEntry32.szexFile))=大写(ExeFileName))
或者(大写(fpProcessEntry32.szexFile)=大写(ExeFileName)),然后开始
结果:=真;
结束;
ContinueLop:=Process32Next(FSnapshotHandle,fpProcessEntry32);
结束;
闭合手柄(FSnapshotHandle);
结束;

正如您在评论中所说,您希望检查注册表更改,因此,您的方法不好。 使用计时器连续检查不是解决方案。Windows API定义了一组与注册表监视相关的特殊函数/挂钩。他们一有变化就被解雇了。你的应用只需等待更改,CPU时间为0%

看看这个示例:

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

此外,如果注册表更改非常重要,可以选择将应用程序/部件或它作为windows运行

[编辑]

关于应用程序/流程监控,您应该掌握流程的运行情况。如果它没有退出,请启动它,获取句柄,然后为您的应用程序启动。有些是为了灵感。WaitForSingleObject只需等待应用程序终止。如果未控制终止(退出代码),则可以重新启动


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

正如您在评论中所说,您希望检查注册表更改,因此,您的方法不好。 使用计时器连续检查不是解决方案。Windows API定义了一组与注册表监视相关的特殊函数/挂钩。他们一有变化就被解雇了。你的应用只需等待更改,CPU时间为0%

看看这个示例:

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

此外,如果注册表更改非常重要,可以选择将应用程序/部件或它作为windows运行

[编辑]

关于应用程序/流程监控,您应该掌握流程的运行情况。如果它没有退出,请启动它,获取句柄,然后为您的应用程序启动。有些是为了灵感。WaitForSingleObject只需等待应用程序终止。如果未控制终止(退出代码),则可以重新启动


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

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

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

可能的ProcessExists()返回True,因此Sleep()永远不会执行函数ProcessExists(exeFileName:string):布尔;var-ContinueLoop:BOOL;FSnapshotHandle:THandle;FProcessEntry32:TProcessEntry32;begin FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);ContinueLop:=Process32First(FSnapshotHandle,fpProcessEntry32);结果:=假;当整数(continueLop)0开始时,如果((大写(ExtractFileName(FProcessEntry32.szexFile))=大写(ExeFileName))或(大写(FProcessEntry32.szexFile)=大写(ExeFileName)),则开始结果:=True;结束;ContinueLop:=Process32Next(FSnapshotHandle,fpProcessEntry32);结束;闭合手柄(FSnapshotHandle);结束;您好,如果您想添加一些代码,您可以编辑您的问题。无论如何,我想有人会补充,一个完整的答案。顺便说一句,你想达到什么目的?这是某种正在执行的服务吗?看起来你只需要安装一些AV软件。更改注册表是完全正常的。几乎所有的程序都这样做。这样的轮询不是检测注册表更改的方法;var-ContinueLoop:BOOL;FSnapshotHandle:THandle;FProcessEntry32:TProcessEntry32;begin FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);ContinueLop:=Process32First(FSnapshotHandle,fpProcessEntry32);结果:=假;当整数(continueLop)0开始时,如果((大写(ExtractFileName(FProcessEntry32.szexFile))=大写(ExeFileName))或(大写(FProcessEntry32.szexFile)=大写(ExeFileName)),则开始结果:=True;结束;ContinueLop:=Process32Next(FSnapshotHandle,fpProcessEntry32);结束;闭合手柄(FSnapshotHandle);结束;您好,如果您想添加一些代码,您可以编辑您的问题。无论如何,我想有人会补充,一个完整的答案。顺便说一句,你想达到什么目的?这是某种正在执行的服务吗?看起来像你
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;