![]() |
AW: Klasse zum Beenden eines Prozesses
irgendwie vermisse ich noch an geeigneter Stelle ein
Delphi-Quellcode:
, sonst kann die Konstallation eintreten, dass willkürlich ein Prozess terminiert wird (Prozess nicht gefunden, FProcessID steht zufällig auf einem Wert, der ein existierenden Prozess bezeichnet).
FProcessID:=0;
|
AW: Klasse zum Beenden eines Prozesses
Es ist ja bekannt, dass TerminateProcess() einen Prozess nicht unbedingt ordnungsgemäß beendet.
Darum werfe ich die Funktion SafeTerminateProcess vom Artikel ![]() Siehe auch eine ![]() Anbei noch 2 Funktionen zum Überprüfen, ob ein Prozess beendet wurde:
|
AW: Klasse zum Beenden eines Prozesses
Irgendwie verstehe ich nicht, warum das hier in eine Klasse gegossen wird.
Eine schnöde function/procedure hätte es auch getan. Aber nun erzeuge ich eine Instanz um eine andere Instanz zu beenden und dann beende ich diese Beende-Instanz. Klingt irgendwie nicht logisch. Was für mich Sinn ergeben würde, wäre eine Klasse, die zu einem Prozess Informationen gibt. Wieviele Instanzen sind aktiv, wie hoch ist der Speicherverbrauch, etc. Ja, die Möglichkeit einen Prozess zu killen gehört da auch rein. Als Events würden sich anbieten, wenn einen neue Instanz auftaucht und wenn eine Instanz verschwindet. Dann würde sich auch eine Klasse rechtfertigen. Wäre also eine TaskManagerKlasse für jeweils eine Anwendung. |
AW: Klasse zum Beenden eines Prozesses
Zitat:
|
AW: Klasse zum Beenden eines Prozesses
Zitat:
|
AW: Klasse zum Beenden eines Prozesses
Zitat:
Zitat:
Zitat:
Zitat:
@Toms: Richtig mittels GetExitCodeProzess könnte ich bei einem TimeOut von 0 Millisekunden prüfen, ob der Prozess beendet wurde. |
AW: Klasse zum Beenden eines Prozesses
Man muss eine Instanz von
Delphi-Quellcode:
erzeugen um eine andere Instanz zu beenden.
TKillProcess
Das halte ich für unlogisch. Mit der Klasse
Delphi-Quellcode:
fragst du eh schon die Eigenschaften des Prozesses ab, weil du ja zu einem ExeNamen die ProcessID ermitteln möchtest.
TKillProcess
Für mich würde die Klasse nur dann einen Sinn ergeben, wenn die Klasse eine längere Daseinsberechtigung als nur zum reinen Killen des Prozesses. Eine Möglichkeit wäre es doch erst beim Aufrufen der Methode Kill die ProcessID zu ermitteln und dann zu killen. Dann erzeugt man sich die Klasse, gibt den ExeNamen an und immer wenn man diese Exe aus dem Speicher haben möchte ruft man einfach Kill auf und die Prozesse werden gelöscht. Das vermisse ich auch irgendwie, wenn eine Anwendung n-fach gestartet wurde, dann wird nur eine gelöscht. Welche das ist, hängt davon ab, welche als letzte in der Prozess-Liste steht. Somit würde ich erwarten, dass bei der Angabe eines ExeNamens alle Prozesse gelöscht werden, die dazu gehören. Dann wäre das Verhalten auch eindeutig und nicht ein Zufallsprodukt. Ei Argument, was noch gegen die Verwendung einer Klasse spricht ist, dass es bei dem jetzigen Aufbau zu Fehlern kommen kann, die man so eigentlich nicht haben will.
Delphi-Quellcode:
Dieses ist durch dein Design so möglich und kann dazu führen, dass
KP := TKillProcess.Create;
try KP.FileName := 'notepad++.exe'; // Jetzt ermittelt die Klasse die PID // Ich muss jetzt noch ein paar Sachen prüfen, die so eine gewisse Zeit dauern Sleep( 10000 ); // So als Dummy-Beschäftigung KP.Kill; // Ja, ist denn die PID von eben immer noch die richtige? finally KP.Free; end; a) Der Prozess ist schon beendet worden (von wem auch immer) Wenn Kill jetzt einen Fehler wirft, ist der Fehler dann nicht verwirrend. Ich möchte das als Resultat der Prozess nicht mehr im System läuft. Das ist ja auch erreicht worden (zwar nicht ursächlich durch die Klasse, aber das Resultat ist das Gleiche) aber ich bekomme einen Fehler. Könnte man evtl. noch mit leben b) Der Prozess ist schon beendet worden( von wem auch immer) und ein völlig anderer Prozess (z.B. outlook.exe) hat jetzt die gleiche PID bekommen wie notepad++.exe vorher hatte. Nun wird mit Kill nicht notepad++.exe sondern outlook.exe geschlossen |
AW: Klasse zum Beenden eines Prozesses
Zitat:
Ich sage nur, daß es ab Vista größere Probleme aufgrund der Sitzungsisolation und der Integritätsniveaus kommen wird. Ob und/oder wie das beherzigt wird, ist mir an Ende egal :zwinker: |
AW: Klasse zum Beenden eines Prozesses
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Ei Argument, was noch gegen die Verwendung einer Klasse spricht ist, dass es bei dem jetzigen Aufbau zu Fehlern kommen kann, die man so eigentlich nicht haben will. Zitat:
Delphi-Quellcode:
KP := TKillProcess.Create;
try // Ich muss jetzt noch ein paar Sachen prüfen, die so eine gewisse Zeit dauern Sleep( 10000 ); // So als Dummy-Beschäftigung KP.FileName := 'notepad++.exe'; // Jetzt ermittelt die Klasse die PID KP.Kill; // Ja, ist denn die PID von eben immer noch die richtige? finally KP.Free; end; |
AW: Klasse zum Beenden eines Prozesses
Hmmm, wenn man eine Klasse nur dann korrekt benutzen kann, indem man x Vorgaben einhält, und diese Vorgaben aber nur durch ein ungeschicktes Design der Klasse herrühren, dann würde ich immer das Design der Klasse ändern.
Ansonsten muss man an solche Klassen immer den Hinweis kleben: Zitat:
![]() Prozess und Instanz Wenn eine Anwendung x-fach gestartet ist, und man findet somit im System auch x Prozesse, so kann man im übertragenen Sinne auch von Instanzen sprechen. Ich wollte damit nur sprachlich darstellen, dass hier etwas erzeugt wird um etwas anderes zu zerstören und dann muss ich diesen Zerstören selber wieder zerstören, weil dieser nutzlos geworden ist (es sei denn ich weise diesem wieder einen neuen Wert zu) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz