2010-10-31 113 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