代码之家  ›  专栏  ›  技术社区  ›  dummzeuch Stijn Sanders

如何冻结程序的执行?

  •  7
  • dummzeuch Stijn Sanders  · 技术社区  · 14 年前

    假设我有一个程序,它占用处理器和/或硬盘,使它几乎不可能在那台计算机上做任何其他事情。现在,我不想杀死这个程序,因为它所做的是有用的(它是一个批处理作业,实际上CPU或磁盘很重,例如它可以压缩几GB的数据文件),但在很短的时间内,我需要在那台计算机上做些其他的事情。外部程序有没有办法暂时冻结性能杀手?

    这就像老的DOS选项,可以在程序之间切换,而实际上不需要多任务处理。

    假设所讨论的假设程序是第三方产品,我没有源代码,也无法让它暂停。

    我知道我可以更改程序的优先级,例如在TaskManager中,但这还不够,我想冻结它。

    我说的是WindowsXP作为操作系统,我想用Delphi编程解决方案。我拥有这台机器的所有权利,所以我可以以管理员的身份启动,替换文件,如果有必要,我还可以安装一个服务。

    4 回复  |  直到 8 年前
        1
  •  4
  •   vcldeveloper    14 年前

    ProcessInfo

    var
      Process : TProcessItem;
      AThread: TThreadItem;
    begin
      Process := ProcessInfo1.RunningProcesses.FindByName('notepad.exe');
      if Assigned(Process) then
      begin
        for AThread in Process.Threads do
          AThread.SuspendThread;
      end;
    end;
    

    here

        2
  •  14
  •   Peter G.    14 年前

    Process Explorer Suspend

    http://www.c-plusplus.de/forum/viewtopic-var-p-is-1460293.html

    #include <windows.h>
    
    _NtSuspendProcess NtSuspendProcess =
        (_NtSuspendProcess) GetProcAddress( GetModuleHandle( "ntdll" ),
                                            "NtSuspendProcess" ); 
    HANDLE ProcessHandle = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid);
    NtSuspendProcess( ProcessHandle );
    
        3
  •  6
  •   Runner    14 年前
        4
  •  2
  •   dummzeuch Stijn Sanders    8 年前
    function OpenThread(dwDesiredAccess: DWORD; InheritHandle: Boolean; dwThreadID: DWORD): THandle; stdcall; external 'kernel32.dll';
    
    function ResumeProcess(PID: DWORD):Boolean;
    var
      tid, snap: THandle;
      TE32: TThreadEntry32;
    begin
      Result := False;
      snap := CreateToolHelp32SnapShot(TH32CS_SNAPTHREAD, 0);
      TE32.dwSize := SizeOf(TThreadEntry32);
      Thread32First(snap, TE32);
      repeat
        if TE32.th32OwnerProcessID = PID then begin
          tid := OpenThread($0002, FALSE, TE32.th32ThreadID);
          ResumeThread(tid);
          Result := TRUE;
          CloseHandle(tid);
        end;
      until Thread32Next(snap, TE32) = false;
      CloseHandle(snap);
    end;
    
    function SuspendProcess(PID: DWORD): Boolean;
    var
      tid, snap: THandle;
      TE32: TThreadEntry32;
    begin
      Result := False;
      snap := CreateToolHelp32SnapShot(TH32CS_SNAPTHREAD, 0);
      TE32.dwSize := SizeOf(TThreadEntry32);
      Thread32First(snap, TE32);
      repeat
        if TE32.th32OwnerProcessID = PID then begin
          tid := OpenThread($0002, FALSE, TE32.th32ThreadID);
          SuspendThread(tid);
          Result := TRUE;
          CloseHandle(tid);
        end;
      until Thread32Next(snap, TE32) = false;
      CloseHandle(snap);
    end;