Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Mi 12.01.11 16:52 
Hallo!

In Ergänzung zu meiner vorherigen Fragen über die Kontrolle eines Arbeitsthreads habe ich noch folgendes Problem:

Der Hauptthread startet einen Arbeitsthread und arbeitet weiter während dieser seine Aufgabe erledigt. Wie kann nun der Hauptthread über das Ende des Arbeitsthreads informiert werden?

Wie gesagt soll der Hauptthread weiterarbeiten während der Arbeitsthread seine Aufgabe erledigt. Der Hauptthread kann also nicht aktiv auf das Ende des Arbeitsthread warten indem er z.B. ein einer While-Schleife den ThreadStatus überprüft und wartet bis dieser nicht mehr Running ist.

Der Arbeitsthread kann auch kein Eventauslösen, weil die Bearbeitung des Events dann ja immer noch im Arbeitsthread stattfinden würde.

Die Einzige Möglichkeit die mir eingefallen ist, wäre die Verwendung eines Timers im Hauptthread. Dieser überprüft in regelmäßigen Abständen den Arbeitsthread während der Hauptthread ansonsten weiterarbeitet. Dabei bin ich mir aber gar nicht sicher, ob der Timer überhaupt anspringt solange der Hauptthread noch aktiv andere Aufgaben durchführt.

Wie löst man diese Aufgabe also korrekt?

Besten Dank
Ares
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 12.01.11 17:35 
Hallo,

korrekt ist jede Lösung die Funktioniert, nur Elegant ist sie nicht immer ;).

Ich würde das über eine CallBack-Methode lösen. Also eine Methode des Hauptthreads, welche per synchronize aus dem Arbeitsthread aufgerufen wird, bevor dieser sich beendet.

Gruß
Klabautermann
Ares Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Mi 12.01.11 17:49 
Hallo!

Vielen Dank für die Antwort. Ein CallBack ist ja quasi ein Event. Hierbei ist dann wie gesagt das Problem, dass dieses vom Arbeitsthread ausgeführt wird und nicht im Hauptthread.

Du hast gesagt, dass der Aufruf per synchronize erfolgen sollte. Ich denke, dass dies das Problem löst, allerdings habe ich hierzu nichts gefunden. Wie genau erfolgt so ein Aufruf per synchronize? Wo ist synchronise implementiert?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 12.01.11 17:52 
Hier geht es ja um .NET, oder? Was benutzt du denn? Einen Backgroundworker? Da gibt es doch auch RunWorkerCompleted oder so als Event, oder?

Jedenfalls muss der Zugriff mit dem Hauptthread einfach nur synchronisiert werden. Soweit ich mich entsinne reicht da ein delegate.
Ares Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Mi 12.01.11 21:38 
Nein, einen Backgroundworker verwende ich (noch) nicht. Ich habe noch nicht viel Erfahrung mit der Verwendung von Threads. Ich habe also einfach ein Thread-Objekt erstellt und dieses gestartet...

Wegen der mangelnden Erfahrung weiß ich auch nicht wie icb "einfach den Zugriff mit dem Hauptthread synchronisiere". Hast du hierzu noch einen Tipp in welche Richtung ich hier suchen muss?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 12.01.11 22:01 
Hallo Ares,

evtl. hilft dir folgende Komponente dabei CrossThread Calls?