在我的代码中,我有一个while循环。
老实说我不需要它甚至是一个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;
端;
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;
答案 0 :(得分:6)
正如您在评论中所说,您想检查注册表更改,因此,您的方法并不好。 使用计时器连续检查不是解决方案。 Windows API定义了一组与注册表监视相关的特殊功能/挂钩。在进行更改时,他们会被解雇。您的应用只需等待0%CPU时间的更改。
看看这个示例:Monitoring Registry Changes
为注册表监控定义专用线程,以防止应用程序冻结。
此外,如果注册更改至关重要,也许可以使用app / part或它作为Windows service运行。
[编辑]
关于应用程序/进程监视,您应该获得运行进程的句柄。如果它没有退出,则启动它,获取Handle,并为您的应用程序WaitForSingleObject。一些code获得灵感。 WaitForSingleObject只是等待应用程序终止。如果不控制终止,您可以重新启动它(退出代码)。
另外,如果您想禁止用户停止,请考虑将您的应用作为Windows服务运行。它将以系统特权运行,如果用户没有管理员权限,Windows将拒绝停止您的应用。
答案 1 :(得分:0)