Einzelnen Beitrag anzeigen

Basti1991

Registriert seit: 15. Jul 2007
7 Beiträge
 
#1

Killen eines hängenden Prozessesn [Prozess reagiert nicht]

  Alt 25. Sep 2009, 16:38
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
  Mit Zitat antworten Zitat