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?