2010-10-31 112 views
7

假设我已经有了一个让处理器和/或硬盘大量生产的程序,以至于几乎不可能在该计算机上执行其他任何操作。现在我不想杀掉那个程序,因为它的功能很有用(这是一个批处理作业,真的是CPU或磁盘繁重,例如它可以压缩几千兆字节的数据文件),但是我需要做很短的时间那台电脑上的其他东西。有没有什么办法可以让外部程序暂时冻结这个性能杀手?如何冻结程序的执行?

这就像旧的DOS选项切换程序之间没有实际多任务。

假设有问题的假设程序是第三方产品,但我没有源代码,也无法告诉它暂停。

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

我正在谈论Windows XP作为操作系统,并希望用Delphi编程解决方案。我对机器拥有所有权利,因此我可以以管理员身份启动某些功能,替换文件,并在必要时安装服务。

+2

源代码的替代解决方案:http://stackoverflow.com/questions/11010165/ho-to -suspend-resume-a-process-in-windows/11010508#11010508 – 2012-06-13 16:33:48

回答

4

你可以用我ProcessInfo组件暂停属于该进程的所有线程。该方法与Runner向您解释的相似。该代码将是这样的:

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; 

可以使用的DebugActiveProcess使用下载的ProcessInfo形式here

+0

即使其他人也是正确的,并且包含关于细节的更多信息,但我很懒,所以我喜欢使用组件。 – dummzeuch 2010-11-01 08:30:27

+0

@vcldeveloper,这与resmon有何不同http://stackoverflow.com/a/21649539/632951? – Pacerier 2017-01-29 12:13:47

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); 
+1

是的,但是它使用了什么API调用?在所有进程的线程上挂起线程? http://msdn.microsoft.com/en-us/library/ms686345(v=VS.85)。aspx – 2010-10-31 10:08:02

+3

了解Russinovich和他对内核的了解后,可能会直接使用NtSuspendProcess。 – Runner 2010-10-31 10:12:41

+0

Here in the English in English http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx – 2010-10-31 10:33:28

6

如果你想这样做编程,你可以使用的方法描述here

什么是,枚举进程中的所有线程,然后暂停它们。没有SuspendProcess API,所以这是对这种调用的模拟。

请注意,这可能会有一些不良的副作用。它取决于过程和写入过程。

我不知道在Win32/64 API世界中有任何其他的方式来做到这一点。如果你进入核心域并使用NT * API,则可以使用“NtSuspendProcess”API。但这是没有记录的,所以它可以随任何版本的Windows甚至任何服务包(不太可能)改变。

“NtSuspendProcess”的声明可以在Windows API的JEDI端口中找到。

2
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; 

希望这有助于

+1

使用tlhelp32; (在你的使用条款中加入这个) – opc0de 2010-10-31 10:34:10