![]() |
AW: Dinge in meinen Thread queuen
Vielen Dank für die Hilfe bislang aber nein ;-)
Ganz abseits von konkreten Beispielen: Ich möchte das, was man mit dem
Delphi-Quellcode:
und
TThread.Synchronize(..)
Delphi-Quellcode:
dem Hauptthread zuwerfen kann, einem x-beliebigen Thread zuwerfen können.
TThread.Queue(..)
Ein konkretes Beispiel: Ich habe einen Polling-Thread der einen Zustandwechsel feststellt. Diesen Zustandswechsel von X auf Y soll ein anderer Thread mitbekommen und verarbeiten- Die Reaktion auf den Wechsel soll also nicht im Kontext des Polling-Threads erfolgen. Die Reaktion des Verarbeiters darf auch gerne erst kommen, wenn schon drei weitere Zustandwechsel stattgefunden haben, kein Problem. Man sieht: Beide Threads existieren bereits und werden das auch die ganze Laufzeit über tun. Der Verarbeiter hat auch noch mehr zu tun als nur darauf mal zu reagieren. Aber die Reaktion muss halt in seinem Kontext geschehen. Genau wie der GUI-Hauptthread der ja üblicherweise auch andere Dinge macht als den Kram dem man ihm mit TThread.Synchronize(..) zuschiebt. |
AW: Dinge in meinen Thread queuen
Für so Dinge verwende ich meistens Events (
![]() ![]() Thread 2 erstellt ein Event und wartet direkt im Execute auf signal. Thread 1 sinalisiert das Event, nachdem die Daten da sind. Thread 2 blockiert nun nicht mehr und bearbeitet die Daten. Wenn Thread 1 während der Bearbeitung weitere Daten hat, werden die ebenfalls an Thread 2 übergeben (hierfür sollte Thread 2 z.b. einen Stream bereitstellen. CriticalSections bei gemeinsamen Zugriff nicht vergessen!). Thread 2 arbeitet dann so lange, bis keine Daten mehr da sind, setzt dann das Event wieder zurück und fängt die Schleife von vorne an. BTW: Wenn es dir konkret um eine Server Anwendung geht, dann such mal nach IO Completion Ports. |
AW: Dinge in meinen Thread queuen
Grade das macht ja nur Sinn wenn der wartende Thread ("Thread 2") sonst keine Aufgabe hat.
|
AW: Dinge in meinen Thread queuen
Zacherl war schneller!
Events... Und eine Queue mit Locking... |
AW: Dinge in meinen Thread queuen
Zitat:
Edit: Ansonsten kannst du auch Events "peeken", indem du das Timeout von WaitForSingleObject auf 0 setzt und den entsprechenden Rückgabewert auswertest. |
AW: Dinge in meinen Thread queuen
Man sollte sich einmal die Frage stellen (und beantworten) warum gibt es für den GUI-Thread das Sync und Queue.
Evtl. weil einen die Standard Sync-Methoden (CriticalSection, Event, ...) dort nicht weiterbringen? Aber die anderen (nicht-GUI-) Threads können mit denen sehr wohl umgehen. Jetzt nochmal: Wozu ein EnqueueInThread? Erstell eine Queue, sichere die mit einer CriticalSection und setze den Event. Dann hat man genau das. Ob diese Queue dann von 1 oder n Threads abgefragt wird ist dann wumpe. |
AW: Dinge in meinen Thread queuen
Ja, das führt in diesem Beispielfall mit dem Pollingthread auch zum Ziel. Aber allgemein bringt das noch kein "Wie führe ich X im Kontext von Thread Y aus?". Oder für meinen Kopf ist es heute schon zu spät.
Und warum kann ich bei TThread.Synchronize überhaupt ein anderes TThread-Objekt angeben? Die TThread-Instanzmethode CheckSynchronize springt mit Exception raus wenn sie nicht im GUI-Thread ausgeführt wird //Edit Zitat:
|
AW: Dinge in meinen Thread queuen
Nehmen wir mal an, du bekommst Schafe und die Schafe sollen entweder geschoren, gefüttert oder gestreichelt werden.
Dann hast du da einen SchafStreichelThread, einen SchafScherThread und einen SchafFütterThread und denen gibts du dann die Schafe, die du bekommst. Ich sage dieser Ansatz ist komplett falsch. Erstelle dir einen SchafStreichler, SchafScherer und SchafFütterer. Dann bringst du das Schaf mit einem von den dreien zusammen und die Arbeit fängt dann an, wenn irgendein Thread das in die Hand nimmt. Jetzt hat man die konkrete Aufgabe von dem Ausführungskontext getrennt und der Thread ist nur noch Kontext und die Daten mit dem Werkzeug sind nur noch Aufgabe. |
AW: Dinge in meinen Thread queuen
Mein Phantasiebeispiel wäre dass der Pollingthread eine zu starke Temperaturschwankung innerhalb eines Zeitfensters registriert und das dann meldet.
Der andere Thread schaut "Gab es Schwankungen?". Wenn ja, holt er sich die zuletzt aufgetretenen und für ihn neuen Schwankungen. Er vergleicht das mit anderen Dingen, tut andere Dinge, kommuniziert mit anderen Geräten. Ich kann das nicht auf Objekte (Schafe) bei denen nur wichtig ist, dass bis irgendwann einmal bestimmte Aufgaben auf ihnen ausgeführt worden sind abbilden. Man sieht: Der Pollingthread läuft mit einem kurzen Interval. Der Verarbeiter läuft in einem wesentlich langsameren Interval und hat eventuell relativ lange, blockierende Aufrufe drin. Es ist nicht wichtig, dass ich SOFORT auf diese Schwankungen reagiere, aber ich darf keine verpassen. Deshalb die Trennung in zwei. Vielleicht ist es für mich auch schon zu spät :drunken:, ich grübel bis morgen das einmal durch. Vielleicht liege ich ja wirklich einfach daneben. |
AW: Dinge in meinen Thread queuen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz