![]() |
Delphi-Version: XE2
Wie schließe ich einen schlafenden Thread ?
Hallo zusammen,
ich starte einen Thread mit Start und pausiere diesen mit Suspend. Wenn ich diesen mit Terminate stoppen will bleibt mir der Thread aber erhalten (Taskmanager). Vorher wieder mit Resume aufwecken und dann stoppen klappt. Ist das die richtige Vorgehensweise ??? Gruß MarLe (mir ist bekannt dass Suspend und Resume deprecated sind) |
AW: Wie schließe ich einen schlafenden Thread ?
Man legt Threads eben nicht mit Suspend lahm. :warn:
Wenn du das nicht mehr machst, dann hat sich dieses Problem automatisch gelöst. Der Thread befindet sich dadurch in einem unsicheren Zustand, er könnte sogar das ganze Programm lahmlegen, wenn man ihn z.B. anhält, wärend er grade was im MemoryManager erledigt und dadurch die Sperre nicht mehr freigegeben wird. Und wenn man ihn nun auch noch "hart" abschießen würde, dann bleibt dieser Zustand für immer so, vorallem da der Thread dann nix mehr aufräumen kann, wofür er aber arbeiten müßte. Fazit: - du machst das nicht mehr und fertig ist - oder du läßt den Thread weiterlaufen, sagst ihm "hör auf" und er beendet sich selber |
AW: Wie schließe ich einen schlafenden Thread ?
... das weis ich ja dass man Suspend eigentlich nicht mehr verwenden soll.
Ich habe das Demo TThreadObject von Luckie durchgearbeitet (weil es meinen Anforderungen ähnelt) und da tritt der Fall auf. Habe ansonsten zwar einiges gelesen und teilweise verstanden wie man es machen soll, aber kein so schönes fertiges Beispiel zum Testen (und erweitern) gefunden. Gruß MarLe |
AW: Wie schließe ich einen schlafenden Thread ?
Du könntest einen Event nutzen, siehe
![]() ![]() ![]()
Delphi-Quellcode:
Im Execute des Threads wartest Du dann auf diesen Event.
constructor TDingsThread.Create;
begin FEvent := CreateEvent(nil, true, true, ''); inherited; end; destructor TDingsThread.Destroy; begin CloseHandle(FEvent); inherited; end;
Delphi-Quellcode:
Anhalten geht dann mit ResetEvent, Fortfahren mit SetEvent.
while (WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0) and not Terminated do
Delphi-Quellcode:
Wenn ich nichts Wesentliches vergessen habe, sollte das so funktionieren.
procedure TDingsThread.Pause;
begin ResetEvent(FEvent); end; procedure TDingsThread.ContinueWork; begin SetEvent(FEvent); end; |
AW: Wie schließe ich einen schlafenden Thread ?
Man könnte sich noch vor und nach die Schlaf-Schleife eine Variable platzieren, über welche man extern abfragen kann, ob der Thread grade arbeitet.
z.B. ein LongBool (nach LongInt gecastet), welcher über ![]() |
AW: Wie schließe ich einen schlafenden Thread ?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
Danke für die Tipps, habe jetzt mal versucht das Beispiel "quick and dirty" auf Events umzustellen. Jetzt hängt sich das Ganze im Betrieb auf (keine Rückmeldung). Beim Debuggen zählt er den Counter noch hoch, aber irgendwas stimmt mit der GUI Synchronisation scheinbar nicht. Vielleicht hat Jemand Lust sich das mal anzuschauen. (dass der Zugriff auf TListView nicht threadsicher ist weis ich, darauf werde ich mich anschließend stürzen) Gruß MarLe |
AW: Wie schließe ich einen schlafenden Thread ?
Nicht TThread.Execute manuell aufrufen, sondern TThread.Start benutzen. :wink:
|
AW: Wie schließe ich einen schlafenden Thread ?
Bzw. TThread.Resume bei Delphi < 2009.
|
AW: Wie schließe ich einen schlafenden Thread ?
Zitat:
|
AW: Wie schließe ich einen schlafenden Thread ?
Aha, hab ich jetzt so umgesetzt, Danke.
Die Threads springen jetzt an, reagieren aber nicht auf Pause bzw. Stop. Vielleicht kann noch mal Jemand eine Blick darauf werfen. Gruß MarLe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz