Seite 1 von 1

Threads

Verfasst: Sa, 30. Apr 2016 16:59
von georg
Hallo,


Freitag abend hatte ich eine Unterhaltung zum Thema Threads, und es ist sicher auch meinem schlechten Namensgedächtnis geschuldet, dass ich mich nicht mehr erinnere, wer mich gefragt hat.

Hintergrund war die Frage, wie Threads beendet werden können, da beim Beenden über den Close-Button der Thread noch sichtbar bleibt.

Ich habe das mal in einem meiner Programme nachvollzogen:

Code: Alles auswählen

   ...
   WHILE nEvent <> xbeP_Close
      ..
   END
RETURN(.T.)
Wenn man das Programm im Debugger ablaufen lässt, und nach dem Schliessen des Dialogs, der im Zusammenhang mit dem Thread steht, bleibt der Thread im Debugger sichtbar - allerdings nur für einige Sekunden, dann entfernt der Garbage-Collector den Thread aus dem Speicher.

Aus Dokumentationszwecken könnte man auch folgenden Code verwenden, damit deutlich ist, dass der Thread hier beendet wird:

Code: Alles auswählen

   ...
   WHILE nEvent <> xbeP_Close
      ..
   END
   ThreadObject():quit()
RETURN(.T.)
Erforderlich ist es nicht, aber man sieht dann auch nach einem Jahr, dass hier der Thread beendet wird. Leider habe ich in der Dokumentation keinen Hinweis darauf gefunden, was mit Threads passiert, die über den obersten Code-Ausschnitt beendet werden, und basiere meine Aussagen auf dem Verhalten, dass ich im Debugger sehe.

Re: Threads

Verfasst: So, 01. Mai 2016 9:48
von Herbert
Kann es sein, dass der Debugger erst nach einer Weile merkt, dass der Thread längstens weg ist und daher dessen Dasein noch kurz vorspielt?
Auch ich finde es richitg, trotzdem ein Beenden einzuprogrammieren. Sicher ist sicher und deine Argumente treffen.

Re: Threads

Verfasst: So, 01. Mai 2016 11:31
von Tom
Wenn man sich im TaskManager die Anzahl der Threads zu (s)einer Applikation anzeigen lässt, sieht man, dass sich diese fast sofort reduziert, wenn ein solcher Thread beendet wird. Ich arbeite schon seit vielen Jahren auf diese Weise. Es ist nicht nötig, über das "RETURN" hinaus, das das Modul beendet, irgendwelche Mechanismen einzubauen, die den Thread vermeintlich beenden, killen oder löschen. Und mit dem Garbage Collector hat das auch nichts zu tun, verwaiste Threads (die es auch nicht geben kann) gehören nicht zu seinem Aufgabenfeld. (Edit: Ausnahme: Das Threadobjekt ist PRIVATE oder PUBLIC, was man tunlichst unterlassen sollte.)

Re: Threads

Verfasst: So, 01. Mai 2016 12:22
von brandelh
Alaska hat immer betont, dass das Ende des Hauptprogrammes alle offenen Threads schließt (abwürgt).
Wenn also nach dem Schließen des Fensters noch Threads über bleiben, werden die von etwas blockiert z.b. extere Zugriffe die Wartezeiten auslösen ...
mir fällt da nur ein Zugriff auf ein nicht existierendes Verzeichnis ein, eventuell auch TCP/IP Requests ...

Ich würde mal prüfen ob das Hauptprogramm überhaupt geschlossen wird, die Post Funktionen könnten das protokollieren.

Re: Threads

Verfasst: Mo, 02. Mai 2016 10:14
von Klaus Schuster
Threads zu Beenden behandelte Clayton Jones recht ausgiebig in "Dialog Windows in Recycled Threads".

Re: Threads

Verfasst: Mo, 02. Mai 2016 11:20
von georg
Erst einmal vielen Dank für die Rückmeldung.

@Tom: wo kann ich im Windows-Taskmanager sehen, welche Threads mein Xbase++-Programm hat? Ich setze Windows 10 ein und bin im TaskManager leider nicht fündig geworden.

@Klaus: danke für die Erinnerung an den Artikel (http://www.cjcom.net/articles/artdirt1.htm)

Allerdings verweist Clayton auch auf die Verwendung von ThreadObject():quit() hin, so dass ich mit diesem Gedanken nicht ganz alleine dastehe.

Re: Threads

Verfasst: Mi, 04. Mai 2016 8:56
von Herbert
Hallo Georg
Unter "Details" kannst du sehr viele Spalten mit der rechten Maustaste in der Ueberschriftenzeile ein- oder ausblenden. Dort findest du die Spalte "Threads".

Re: Threads

Verfasst: Mi, 04. Mai 2016 9:02
von georg
Danke, Herbert -


das ist gut versteckt.