Seite 1 von 1

Thread schließen von "außen" [ERLEDIGT]

Verfasst: Di, 30. Jul 2019 9:22
von Manfred
hi,
über diesen Pushbutton rufe ich aus einem Dialog ein weiteres Fenster auf, was im eigenen Thread läuft.

Code: Alles auswählen

@ 0,0 DCPUSHBUTTON;
                      ACTION {|o|o := Thread():new(), o:start({|o| oDialogZusatz:dispozeigen()})};
                     CAPTION "Tagesdienste";
                       CARGO "AN";
                      OBJECT oDialogZusatz:oPbDispoAnzeigen;
                        SIZE oDialogZusatz:nPbLaenge,oDialogZusatz:nPbHoehe
Wenn der Thread geschlossen wird, ist alles klar, aber wenn der User die reihenfolge nicht einhält und den Dialog schließt, aus dem der Thread erzeugt wurde, bleibt der Thread erhalten. So wie wir die User kennen, machen die das dann zig mal und jedesmal wird der Thread neu erstellt und bleibt irgendwo stehen.
Ich möchte aber nun den Thread irgendwie abschießen (sobald ich DCREAD GUI verlasse), wenn der Ursprungsdialog geschlossen wird, ohne das der thread selbst vorher geschlossen wurde. Wie gehe ich da vor?
die Variable O steht da nicht mehr zur Verfügung, oder ist auf jden FAll da unbekannt.

Re: Thread schließen von "außen"

Verfasst: Di, 30. Jul 2019 9:38
von Tom
Du kannst beim Erzeugen der Subthreads die Thread-ID des Originals mitgeben (Funktion ThreadID()), und im Subthread selbst prüfen, ob diese noch in der Rückgabe von ThreadInfo(THREADINFO_TID) enthalten ist. Das könntest Du in einem TIMEOUT-Codeblock tun. Der Vorteil wäre dann auch, dass sich das gleiche Fenster, insofern mehrfach offen, nur bezogen auf seinen Starter schließt.

Re: Thread schließen von "außen"

Verfasst: Di, 30. Jul 2019 10:18
von Manfred
Ermitteln der ThreadId, daran habe ich auch schon gedacht. Aber wo mache ich das? Im Action Codeblock klappte es nicht.

Re: Thread schließen von "außen"

Verfasst: Di, 30. Jul 2019 10:25
von Manfred
Alles klar, ich hatte Deine Aussage falsch verstanden.

Re: Thread schließen von "außen"

Verfasst: Di, 30. Jul 2019 12:06
von Tom
Du brauchst nur die ThreadID des Aufrufers, und die bekommst Du irgendwo im Code über ThreadID(). Die geht dann z.B. als Parameter oder Owner-Eigenschaft oder sonstwie an den erzeugten Thread, und der prüft halt regelmäßig, ob die Rückgabe von ThreadInfo(1) noch diese ID enthält (Achtung, zweidimensional). Und wenn nicht, schließt er sich eben.

Möglicherweise ließe sich das auch generalisieren, aber auf Klassenebene. Wäre jedenfalls eine ziemlich elegante Lösung - und Du hättest eine eindeutige Eltern-Kind-Beziehung.

Re: Thread schließen von "außen"

Verfasst: Di, 30. Jul 2019 14:06
von Manfred
Danke Tom,
ich bin schon dran. Habe ein paar Lösungen gefunden, für verschiedene Zwecke. Werde Deine auch versuchen und schauen, wie sie mir helfen kann.

Re: Thread schließen von "außen" [ERLEDIGT]

Verfasst: Mi, 31. Jul 2019 16:32
von Manfred
Hi Tom,
Danke für den Tipp mit dem Timeout. Den habe ich umgesetzt und es sieht gut aus, das er das macht was ich brauche. Mal sehen ob und wie er sich in der Praxis bewährt.

Re: Thread schließen von "außen" [ERLEDIGT]

Verfasst: Mi, 31. Jul 2019 16:38
von Jan
Manfred,

ich hatte das jetzt nicht im Detail durchgelesen. Aber in der Onlinehilfe gibt es zum Thema Thread() ein Codebeispiel, wie man einen Thread von extern abschießen kann. Hilft das eventuell weiter?

Jan