Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Thread schlafen legen
Bergmann89 - So 07.11.10 18:46
Titel: Thread schlafen legen
Hey,
ich hab zur Zeit einen HauptThread, der meherer kleine Berechnugs-Threads aufmacht. Es sind immer max 8 kleine Threads am werkeln. Wenn jetzt der Haupt-Thread an der Reihe ist, es aber schon 8 kleine Threads gibt, dann hat der HauptThread nix zu tun (weil er keine neuen Thread erstellen muss) un kann ja eigentlich wieder schlafen gehen. Reicht da ein normales sleep(0); oder gibt es eine Thread spezifische Methode dazu?
Mfg & Thx Bergmann.
delfiphan - So 07.11.10 20:26
Auf was wartet der Hauptthread? Auf irgend was muss er ja warten, ...
platzwart - So 07.11.10 20:36
Ist es ein echter Thread, den du startest, oder meinst du das Programm an sich?
Bergmann89 - So 07.11.10 20:55
Hey,
der Hauptthread wartet darauf, das einer der kleinen Threads fertig wird. So das er einen neuen Starten kann. Weil halt immer nur 8 kleine gleichzeitig laufen sollen.
Ich mein nen extra Thread. Nich das Proggi an sich.
MfG Bergmann.
Flamefire - So 07.11.10 22:09
Guck dir mal WaitFor() an.
Bzw hier eher WaitForMultipleObjects
BenBE - Mo 08.11.10 02:54
Für solche Aufgaben eignen sich Zählsemaphore ganz gut:
Mit der Zahl gewünschter Threads initialisieren und beim Starten eines Threads dekrementieren. Fertige Threads inkrementieren vor ihrem Beenden.
Bergmann89 - Mo 08.11.10 03:51
Hey,
dazu müsste ich doch aber zuerst einmal alle Threads erstellen. Und das würde den Speicherverbrauch sprengen. Ich hab das ganze jetzt aber eh etwas anders gelöst. Trotzdem danke für die Hilfe, hab ja was neues gelernt :)
MfG Bergmann
Flamefire - Mo 08.11.10 14:28
Bergmann89 hat folgendes geschrieben : |
| dazu müsste ich doch aber zuerst einmal alle Threads erstellen. Und das würde den Speicherverbrauch sprengen. |
Dann weißt du nicht, was ein Semaphor ist.
Such mal danach besonders im Hinblick auf P() und V()
Das wäre so ziemlich das, was du hier gebrauchen würdest.
Zur Vollständigkeit: Wenn möglich hier kurz deine Lösung erklären. Vl hat das später noch jmd andres.
Bergmann89 - Mo 08.11.10 17:20
Hey,
wie oben geschrieben hab ich es anders gelöst. Es hat sich herausgestellt, das ein Thread der alles der Reihe nach berechnet schneller ist, als die kleinen Threads. Da war wohl der Overheat beim erstellen der neuen Threads zu hoch. Zur Zeit such ich noch nach einer sinnvollen Aufteilung des ganzen, um es wieder MultiCore-fähig zu machen, aber das is ne andere Geschichte...
Nochma zuder Sache mit den Semaphoren:
Die regeln die Zusammenarbeit von mehreren Threads. Sobald die maximale Anzahl des Semaphore erreicht ist, wird jeder weitere Thread der starten (bzw. einen bestimmten Code abarbeiten) will erstmal schlafen geschickt, bis ein anderer fertig ist (grob umrissen).
Mir ist auch grad eingefallen wie man den in meinem Fall richtig benutzt. Hat n bischen länger gedauert. Aber hat sich ja jetzt eh erledigt.
MfG Bergmann
Flamefire - Mo 08.11.10 17:28
Dann erzeug nicht jedesmal nen neuen Thread sondern erstell die am Anfang (Overhead an Speicher ist sehr gering im NormalFall) und lass die Warten, bis die ein Signal zum Arbeiten kriegen.
BenBE - Mo 08.11.10 19:01
Zur Parallelisierung kannst du auch wie von Luckie beschrieben Threads Pools einsetzen. Die Semaphore sind der händische Weg.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!