Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Killen eines hängenden Prozessesn [Prozess reagiert nicht] (https://www.delphipraxis.net/140762-killen-eines-haengenden-prozessesn-%5Bprozess-reagiert-nicht%5D.html)

Basti1991 25. Sep 2009 16:38


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:
  App = 'FlashPrinter2.exe';
  while ProcessExists(App) do
  begin
    sleep(5000);
    KillProcess(GetProcessID(App));
  end;
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.

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:

Zitat:

.also suche ich ne Zuverlässige Lösung
Dann nimm kein Windows
Auch wenn ich für Windows nicht meine Hand ins feuer lege: 1. So sind nunmal meine Vorgaben - man muss lernen damit zu arbeiten, was man bekommt, 2. Wenn mans richtig macht, kann man auch mit Windows was anfangen.

Wie auch immer - vielen Dank für eure Hilfe =)

Viele Grüße,
Sebastian

Namenloser 25. Sep 2009 16:45

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]

Dezipaitor 25. Sep 2009 16:49

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.

Basti1991 25. Sep 2009 16:54

Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
 
Zitat:

Zitat von NamenLozer
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"

Zu blockieren scheint er nicht, da mein Programm mir bei jedem killversuch nen output gibt..der wird dann wird das auch dauernd angezeigt...

Basti1991 25. Sep 2009 16:56

Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
 
sorry für den doppelpost.

Zitat:

Zitat von Dezipaitor
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.

macht sinn...es wird ja der flashprinter-treiber angesprochen...aber es muss doch einen weg geben, diesen flashprinter zu killen...

[edit]need help^^[/edit]

Dezipaitor 25. Sep 2009 18:36

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.

fajac 28. Sep 2009 07:03

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.

rollstuhlfahrer 28. Sep 2009 17:34

Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
 
kannst du das Programm eigentlich erfolgreich mit dem Taskmanager/Prozess-Explorer killen?

Bernhard

Dezipaitor 29. Sep 2009 10:46

Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
 
Diese Programme kochen mit denselben Funktionen, wie alle anderen auch.

Basti1991 29. Sep 2009 16:06

Re: Killen eines hängenden Prozessesn [Prozess reagiert nich
 
Zitat:

Zitat von rollstuhlfahrer
kannst du das Programm eigentlich erfolgreich mit dem Taskmanager/Prozess-Explorer killen?

Bernhard

Jop, mit dem Taskmanager, bzw Tskill klappt das ganze...wenn es auch schon mal einige Zeit dauert bsi das Programm gekillt ist...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz