![]() |
CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet wird
Über welche Option/Flag/Parameter kann ich steuern das mein gestarteter Child-Prozess automatisch beendet wird wenn der Hauptprozess beendet wird (z.B. Absturz Hauptanwendung - Childprozess sollte nicht mehr weiter laufen).
|
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
Unter Windows gibt es da (im Gegensatz zu Unix) spontan nichts. Bei
Delphi-Quellcode:
gibt es kein einfaches Flag, um so etwas zu erreichen.
CreateProcess
Die einzige Lösung die ich kenne sind Jobs. Du kannst in deinem Parent-Prozess einen Job aufmachen, selbst dort als einziger hineinziehen und deine Kindprozesse dann auch dort drinnen aufmachen. Den Job kannst du dann so einstellen dass alle enthaltenen Prozesse terminiert werden wenn das letzte Handle auf den Job geschlossen wird. Da dein Parent der einzige mit einem Handle auf den Job ist, werden alle Kindprozesse terminiert wenn das Parent endet (kontrolliert oder Absturz). Ich mache das bei mir so, funktioniert auch einwandfrei. Mich würde mal interessieren wie Anwendungen wie der Internet Explorer oder Google Chrome das lösen. Beide waren über ihre Multi-Prozess-Architektur anfangs total stolz und haben viele Blogbeiträge verfasst, vielleicht findet man da ja was. Delphi bringt auch in der aktuellsten Fassung die Header-Files für die Job-Geschichte noch nicht mit, ![]() Wenn du willst suche ich bei Gelegenheit nochmal alles zusammen was ich mache und stelle es rein. War jedenfalls schon ein bisschen Arbeit wenn man damit noch nichts gemacht hatte und alle Eventualitäten abdecken will :? |
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
Zitat:
|
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
Liste der Anhänge anzeigen (Anzahl: 1)
Heute wird das knapp :(
Im Endeffekt ist es nicht viel: Ein netter Forenbenutzer hatte sich schonmal die Arbeit gemacht, ![]() Ich weiß nicht mehr, was ich daran noch herumgedoktert habe, aber im Anhang meine (schlimm anzusehende) Version. Bei deinem Kindprozess gibst in CreateProcess bei den
Delphi-Quellcode:
eventuell ein
dwCreationFlags
Delphi-Quellcode:
an.
CREATE_BREAKAWAY_FROM_JOB
Anschließend kannst du sie mit
Delphi-Quellcode:
in deinem Job packen.
AssignProcessToJobObject
Das ist ungefähr so wie ich den Job angelegt habe:
Delphi-Quellcode:
const
jobName: String = 'meinJob'; var errorCode: Cardinal; basicInfo: TJobObjectBasicLimitInformation; extInfo: TJobObjectExtendedLimitInformation; begin // (1) Job-Objekt anlegen jobHandle := CreateJobObject( nil, // Das Handle kann nicht vererbt werden PWidechar(jobName) ); if (jobHandle = INVALID_HANDLE_VALUE) or (jobHandle = 0) then begin errorCode := GetLastError(); log('Konnte kein Job-Objekt erstellen. Fehlercode ' + IntToStr(errorCode) + ': ' + SysErrorMessage(errorCode), ltError); Exit; end; // Weitere interessante Job-Eigenschaften: // JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION // (2) Eigenschaften setzen FillChar(basicInfo, SizeOf(basicInfo), 0); if terminatePluginsOnJobClose then basicInfo.LimitFlags := JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; FillChar(extInfo, SizeOf(extInfo), 0); extInfo.BasicLimitInformation := basicInfo; if not SetInformationJobObject( jobHandle, TJobObjectInfoClass.ExtendedLimitInformation, @extInfo, SizeOf(extInfo) ) then begin errorCode := GetLastError(); log('Konnte Eigenschaften des erstellten Job-Objekts NICHT setzen! Plugins werden' + 'möglicherweise nach unerwartetem Beenden des Hauptprogramms NICHT beendet!' + 'Fehlercode ' + IntToStr(errorCode) + ': ' + SysErrorMessage(errorCode), ltWarning); end; end; |
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
@Günter: deklariere doch einmal die Records als packed und das "fragliche" Array als
![]() |
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
Ich werde es bei nächster Gelegenheit ausprobieren und dich wissen lassen, danke :-)
Nur warum
Delphi-Quellcode:
? Die 25 waren von mir jetzt rein willkürlich gewählt. Ich erwarte schon, dass da mehr als nur eins zurückkommt...
[0..0]
Auch wenn es nur WinAPI-Header sind, die Unit ist wirklich peinlich :oops: Irgendwann. Irgendwann mach ich das mal ordentlich 8-) |
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
Hast Du den Link in meinem letzten Post übersehen? Da wird erklärt, was es mit dem 0..0 auf sich hat.
|
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
Jepp, übersehen. Blöde Sonne knallt zu stark auf den Monitor 8-)
|
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
Einfach das Haus umdrehen :lol:
|
AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet
So, habs jetzt eingebaut. Funktioniert wie erwartet.
Deine HeaderUnit habe ich aber nicht benötigt sondern bin auf die Headerübersetzung der Jedi (JwaWinType, JwaWinNT, JwaWinBase) gegangen da diese eh schon verwendet werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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 by Thomas Breitkreuz