Wie kann ich die Ausführung eines Programms einfrieren?

7

Sagen wir, ich habe ein Programm, das den Prozessor und / oder die Festplatte so sehr nervt, dass es fast unmöglich ist, irgendetwas anderes auf diesem Computer zu tun. Jetzt möchte ich dieses Programm nicht beenden, weil es nützlich ist (es ist ein Batch-Job, der wirklich diese CPU oder Festplatte schwer ist, z. B. könnte es ein paar Gigabyte Datendateien komprimieren), aber für eine kurze Zeit muss ich tun etwas anderes auf diesem Computer. Gibt es irgendeine Möglichkeit, wie ein externes Programm diesen Performance Killer für eine Weile einfrieren könnte?

Es ist wie bei der alten DOS-Option, zwischen Programmen zu wechseln, ohne Multitasking zu betreiben.

Nehmen Sie an, das fragliche hypothetische Programm sei ein Drittanbieter-Produkt, für das ich keinen Quellcode habe und es gibt keine Möglichkeit, es anzuhalten.

Ich weiß, dass ich die Prioritätsklasse des Programms ändern kann, z. in TaskManager, aber das ist nicht genug, ich möchte es einfrieren.

Ich spreche über Windows XP als Betriebssystem und möchte eine Lösung mit Delphi programmieren. Ich habe alle Rechte an der Maschine, also könnte ich etwas als Administrator starten, Dateien ersetzen und ich könnte auch einen Dienst installieren, wenn das nötig ist.

    
dummzeuch 31.10.2010, 10:00
quelle

4 Antworten

4

Sie können meine Komponente ProcessInfo verwenden, um alle zum Prozess gehörigen Threads auszusetzen. Der Ansatz ähnelt dem, was Runner Ihnen erklärt hat. Der Code wäre etwa so:

%Vor%

Sie können den Quellcode von ProcessInfo im Formular hier

    
vcldeveloper 31.10.2010, 13:34
quelle
14

Sie können es mit Process Explorer einfrieren: Klicken Sie mit der rechten Maustaste auf Ihr Programm und wählen Sie Suspend .

Hier ist ein Beispielcode für das programmatische Einfrieren von Ссылка , Bearbeitete und ausgelassene Fehlerprüfung für die Kürze:

%Vor%     
Peter G. 31.10.2010 10:02
quelle
6

Wenn Sie dies programmatisch tun möchten, können Sie den hier beschriebenen Ansatz hier verwenden.

Was ist, ist, alle Threads in einem Prozess aufzuzählen und sie dann auszusetzen. Es gibt keine SuspendProcess-API, daher ist dies eine Simulation eines solchen Aufrufs.

Beachten Sie, dass dies möglicherweise einige schlechte Nebenwirkungen haben kann. Es hängt vom Prozess ab und davon, wie es geschrieben ist.

Ich kenne keine andere Möglichkeit, dies in der Win32 / 64-API-Welt zu tun. Wenn Sie tiefer in das Kernel-Land gehen und die NT * APIs verwenden, steht Ihnen die API "NtSuspendProcess" zur Verfügung. Aber das ist undokumentiert, so dass es sich mit jeder Version von Windows oder sogar mit jedem Service Pack ändern kann (nicht sehr wahrscheinlich).

Die Deklaration von "NtSuspendProcess" kann in den JEDI-Ports der Windows-APIs gefunden werden.

    
Runner 31.10.2010 10:08
quelle
2
%Vor%

Hoffe das hilft

    
opc0de 31.10.2010 10:32
quelle

Tags und Links