Autor Beitrag
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Sa 10.05.03 13:24 
In einem Thread läuft ein langwieriger Prozess ab. Nun möchte ich dem User die Möglichkeit geben, den Prozess abzubrechen. Mit TThread.Terminate klappts natürlich nicht. Also habe ich mal TerminateThread ausprobiert. Manchmal hats damit geklappt, manchmal ist das Programm einfach abgestürtzt, dies war häufiger der Fall. Also habe ich eine Prozedure in der Thread-Klasse definiert, die so aussieht:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TMyThread.ShutDownThread;
var
  ExitCode: Longword;
begin
  GetExitCodeThread(Handle, ExitCode);
  ExitThread(ExitCode);
end;

Wenn ich nun aber im Hauptthread diese Methode aufrufe, ist meine Anwedung niergens mehr zu sehen, scheint aber noch zu laufen, da in der IDE der "Play" Button noch gedrückt ist usw.. Welche Möglichkeit habe ich noch, einen einen langen Prozess in einem Thread abzubrechen oder ist die von mir verwendete Methode die richtige, nur mach ich was falsch?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 13.05.03 08:05 
Hi!

Wieso soll es mit TThread.Terminate nicht funktionieren?
Die Lösung für dein Problem ist, innerhalb des Threads dafür zu sorgen, daß dieser regelmäßig auf Terminated prüft und bei True eben die Prozedur Execute verlässt. Der Befehl Terminate setzt nämlich einfach nur die Boolsche Eigenschaft Terminated auf True, das Beenden muss der Thread dann für sich machen.
Der Sinn dieser Vorgehensweise ist es, daß dem Thread noch die Möglichkeit gegeben wird, kritische Phasen abzuschliessen und belegte Ressourcen freizugeben (wenn du z.B. temporär im Thread Stringlisten erstellst, sollten die auch auf jeden Fall wieder freigegeben werden).

Cu,
Udontknow