1

私のコードには、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; 
4

2 に答える 2

6

コメントで言ったように、レジストリの変更を確認したいので、アプローチは良くありません。継続的にチェックするためにタイマーを使用することは解決策ではありません。Windows API は、レジストリ監視に関連する関数/フックの特別なセットを定義しています。変更が行われると、それらは正確に起動されます。アプリは 0% の CPU 時間で変更を待つだけです。

このサンプルを見てみましょう:レジストリの変更の監視

アプリケーションのフリーズを防ぐために、レジストリ監視用の専用スレッドを定義します。

また、レジストリの変更が重要な場合は、アプリ/パーツを実行するか、Windowsサービスとして実行することをお勧めします。

[編集]

アプリケーション/プロセスの監視については、実行中のプロセスのハンドルを取得する必要があります。終了しない場合は、アプリを開始し、アプリのハンドルとWaitForSingleObjectを取得します。インスピレーションのためのいくつかのコード。WaitForSingleObject は、アプリケーションの終了を待つだけです。終了が制御されていない場合 (終了コード)、再起動できます。

また、ユーザーがアプリを停止できないようにする場合は、アプリを Windows サービスとして実行することを検討してください。システム権限で実行され、ユーザーが管理者権限を持っていない場合、Windows はアプリの停止を拒否します。

于 2012-07-21T08:45:10.760 に答える
0

私は以前、同じコードで同じ問題を抱えていました。コンマ区切りのプロセスリストをワイドストリングに生成できるタイマーを作成し、変数内の関数でプロセス名を検索します。

于 2012-11-18T21:02:58.387 に答える