![]() |
Killen eines hängenden Prozessesn [Prozess reagiert nicht]
Hallo Zusammen,
ich schreibe zur Zeit ein Programm, dass PDFs zu SWF Konvertieren soll. Es nutzt dazu das Programm FlashPrinter von Adobe. Im Prinzip läuft es so ab: Dateiliste erstellen -> Datei aus liste nehmen -> FlashPrinter starten und warten (maximal 20 Minuten) -> Fertig? -> Nächste Datei | | ---> Prozess hängt? ( > 20 Mins) -> Prozess killen und nächste Datei Klappt ja alles Kundebar, nur dass Killen klappt nicht...ich nutze zur Zeit das hier zum killen:
Delphi-Quellcode:
KillProcess(PID: DWord): Bool;
var hProcess: THandle; begin hProcess := OpenProcess(PROCESS_TERMINATE, False, PID); Result := TerminateProcess(hProcess, 0); end;
Delphi-Quellcode:
GetProcessID(Exename: string): DWORD;
var hProcSnap: THandle; pe32: TProcessEntry32; begin result := 0; hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap <> INVALID_HANDLE_VALUE then begin pe32.dwSize := SizeOf(ProcessEntry32); if Process32First(hProcSnap, pe32) = true then begin while Process32Next(hProcSnap, pe32) = true do begin if pos(Exename, pe32.szExeFile) <> 0 then result := pe32.th32ProcessID; end; end; CloseHandle(hProcSnap); end; end;
Delphi-Quellcode:
ProcessExists(ExeName: String): Boolean;
var I: Integer; hSnap: THandle; ProcEntry: TProcessEntry32; s: String; ProcList: TStringList; begin ProcList := TStringList.Create; ProcList.BeginUpdate; ProcList.Clear; hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap <> INVALID_HANDLE_VALUE) then begin ProcEntry.dwSize := SizeOf(ProcessEntry32); if (Process32First(hSnap, ProcEntry)) then begin s := ExtractFileName(ProcEntry.szExeFile); proclist.Add(s); while Process32Next(hSnap, ProcEntry) do begin s := ExtractFileName(ProcEntry.szExeFile); proclist.Add(s); end; end; end; CloseHandle(hSnap); ProcList.EndUpdate; if (ProcList.IndexOf(ExtractFileName(ExeName)) > 0) then result := true else result := false; ProcList.Destroy; end;
Delphi-Quellcode:
also wird solange der Kill Befehl alle 5 Sekunden aufgerufen, bis der Prozess nachgibt..nur tut er das nie..mein Programm hängt sich quasi mit auf, wenn der Flashprinter streikt.
App = 'FlashPrinter2.exe';
while ProcessExists(App) do begin sleep(5000); KillProcess(GetProcessID(App)); end; Gibt es eine möglichkeit den hängenden FlashPrinter abzuschießen? Wäre echt super, müsst halt gut klappen, weil ich hab da um die 45 000 PDFs zu konvertieren (ich Programmier das ja eigentlich nicht für mich selber, sondern für die Firma wo ich arbeite, da fallen so viele PDFs an...rechnerisch würde das Programm ca 8 Tage dauerlaufen..also suche ich ne Zuverlässige Lösung)...Und jezz bitte keine Scherze wie : Zitat:
Wie auch immer - vielen Dank für eure Hilfe =) Viele Grüße, Sebastian |
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
Hallo Basti1991,
Willkommen in der DP :dp: Vermutlich arbeitet OpenProcess blockierend, hält also dein Program mso lange an, bis der FlashPrinter beendet ist. Du könntest diesen Aufruf in einen Thread auslagern. und es heißt "aufgehängt", nicht "aufgehongen" [edit]äh vergiss es...[/edit] |
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
Wenn ein Prozess sich nicht aus der Prozessliste entfernt werden kann, dann liegt das an noch ausstehende IO-Operationen, die sich nicht beenden lassen (z.B. Interrupts). D.h. meist, dass ein Treiber schlecht programmiert wurde.
|
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
Zitat:
|
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
sorry für den doppelpost.
Zitat:
[edit]need help^^[/edit] |
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
Wenn der Treiber keine Abbruchfunktion implementiert, dann wird die IO Operation wohl nicht abzubrechen sein.
Es gibt zwar noch die Funktionen wie CancelIO, aber ob diese helfen kann, kann ich nicht sagen. Schau doch mal mit dem Process Monitor von SysInternals, warum es überhaupt zu einer Blockade kommt. |
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
Möglicherweise hilft es, #WinSysDir#\TaskKill.exe zu benutzen. Du kannst dabei, je nach Bedarf, eine Reihe unterschiedlicher Parameter angeben. Einfach mal in der Kommandozeile "TaskKill /?" eingeben...
Das Programm kannst du mit Hilfe von CreateProcess starten. |
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
kannst du das Programm eigentlich erfolgreich mit dem Taskmanager/Prozess-Explorer killen?
Bernhard |
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
Diese Programme kochen mit denselben Funktionen, wie alle anderen auch.
|
Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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