Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi "Delphi 7" Thread beenden nicht immer möglich (https://www.delphipraxis.net/197805-delphi-7-thread-beenden-nicht-immer-moeglich.html)

Hobbycoder 6. Sep 2018 10:04

"Delphi 7" Thread beenden nicht immer möglich
 
Liste der Anhänge anzeigen (Anzahl: 1)
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
Delphi-Quellcode:
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?

ghubi01 6. Sep 2018 11:28

AW: "Delphi 7" Thread beenden nicht immer möglich
 
Hallo,

wie sieht den die Execute-Methode des Threads aus?

Kann es sein, dass der Thread schon nicht mehr existiert wenn Du ihn in onFormClose beenden willst?
Die Objektvariable für den Thread muss nicht NIL sein wenn der Thread beendet wurde.

Eine andere Möglichkeit wäre, dass der Thread noch auf Bereiche zugreift die nicht mehr existieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 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