Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#1

"Delphi 7" Thread beenden nicht immer möglich

  Alt 6. Sep 2018, 10:04
Ich kämpfe gerade damit unter Delphi 7 einen Thread sicher zu beenden. Manchmal klappt's, manchmal nicht.
Beendet werden soll im OnFormClose.

Ich habe jetzt mehrere Varianten ausprobiert, aber ich lande immer beim gleichen Problem.

Es kommt immer die Meldung:
Zitat:
Im Projekt xxx.exe ist eine Exception der Klasse EAccessViolation aufgetreten: Meldung: 'Zugriffsverletzung bei Adresse 5F965130. Lesen der Adresse 5F965130'. Der Process wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Ich lande daraufhin in der Classes.pas in der function ThreadProc(Thread: TThread): integer; Siehe Bild im Anhang.

Folgende Varianten habe ich ausprobiert:
A:
Delphi-Quellcode:
    if ThreadUpdatePanel<>nil then begin
      ThreadUpdatePanel.FreeOnTerminate:=False;
      ThreadUpdatePanel.Terminate;
      while (True) do begin
        KillThreadResult:=WaitForSingleObject(ThreadUpdatePanel.Handle, Timeout);
        if KillThreadResult = WAIT_FAILED then
          RaiseLastOSError;
        if KillThreadResult = WAIT_OBJECT_0 then
          Break;
      end;
    end;
B:
Delphi-Quellcode:
  if ThreadUpdatePanel<>nil then
  begin
    ThreadUpdatePanel.Terminate;
    ThreadUpdatePanel.WaitFor;
  end;
C:
Message per PostMessage an Thread und ihn sich selbst beenden lassen.

Ich habe es sowohl mit FreeOnTreminate=True als auch mit FreeOnTerminate=False ausporbiert.

Ich habe auch mal das Timeout für Variante A auf 5000 MS hochgesetzt, aber die Fehlermeldung kommt sofort. Es macht den Eindruck als würde der Thread beendet.

Wenn ich dann die Anwendung über Start fortsetze, erscheint ganz kurz das madExcept-Fenster und dann wird die Anwendung beendet.

Irgendwelche Ideen?
Miniaturansicht angehängter Grafiken
classes.png  
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat