Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Thread warten lassen mit WaitForSingleObject() (https://www.delphipraxis.net/212101-thread-warten-lassen-mit-waitforsingleobject.html)

blablab 17. Dez 2022 19:57

Thread warten lassen mit WaitForSingleObject()
 
Hallo!

Ich arbeite mit einer Liste im Haupt-Thread und habe einen Hilfs-Thread, der die komplette Liste durchgeht und jeweils nur den Status einer Eigenschaft des Listeneintrags ermittelt und das Ergebnis wieder in der Liste ablegt. Ich verwende den Hilfs-Thread, weil die Ermittlung des Status unter Umständen sehr lange dauern kann und dann die Anwendung blockieren würde.

Solange der Haupt-Thread die Liste anpasst oder wenn der Hilfs-Thread mit seiner Arbeit (vorerst) fertig ist, soll er schlafen.

Mein erster Ansatz war nun, den Hilfs-Thread mit einer Variable den Zustand "Pausiert" zu verpassen. In diesem Zustand macht er dann nichts anderes als Sleep(10), solange der Zustand "Pausiert" bestehen bleibt, also Polling.

Das finde ich aber unschön und stattdessen habe ich jetzt einen Mutex verwendet. Soll der Hilfs-Thread pausieren, reserviert sich der Haupt-Thread den Mutex. Der Hilfs-Thread versucht nun das Gleiche mit WaitForSingleObject(Mutex, INFINITE) und gerät deshalb in einen Wartezustand. Erst wenn der Haupt-Thread den Pause-Zustand beenden will, gibt er den Mutex wieder frei, der Hilfs-Thread verlässt seinen Wartezustand, bekommt den Mutex und gibt ihn sofort wieder frei.

Das funktioniert so weit ganz gut. Aber normalerweise reserviert man sich mit einem Mutex eine Ressource und ich mache irgendwie genau das Gegenteil. Gibt es vielleicht noch ein anderes, passendes Objekt, auf das ich mit WaitForSingleObject() warten kann, oder eine sonstige, bessere Möglichkeit?

Vielen Dank im Voraus!

jaenicke 17. Dez 2022 20:54

AW: Thread warten lassen mit WaitForSingleObject()
 
Wie wäre es mit Events? Also CreateEvent usw. als API-Funktion bzw. TEvent in Delphi, wenn die Delphiversion neu genug ist.

Auf die kannst du auch warten usw., also genau was du möchtest.

Wenn du WaitForMultipleObjects verwendest, kannst du auch gleichzeitig auf ein Event zum Beenden des Threads warten.

IceBube 17. Dez 2022 21:12

AW: Thread warten lassen mit WaitForSingleObject()
 
Vielleicht liege ich komplett daneben aber kannst du nicht statt dem "Hilfs-Thread" einen "System.Threading.ITask" nützen der das erledigt?

blablab 18. Dez 2022 20:28

AW: Thread warten lassen mit WaitForSingleObject()
 
Danke für die Antworten!

Anscheinend brauche ich eine neue Delphi-Version... :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz