AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dinge in meinen Thread queuen

Ein Thema von Der schöne Günther · begonnen am 31. Jul 2014 · letzter Beitrag vom 12. Dez 2014
Antwort Antwort
Seite 2 von 3     12 3      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19:14
Vielen Dank für die Hilfe bislang aber nein

Ganz abseits von konkreten Beispielen:

Ich möchte das, was man mit dem TThread.Synchronize(..) und TThread.Queue(..) dem Hauptthread zuwerfen kann, einem x-beliebigen Thread zuwerfen können.


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.

Geändert von Der schöne Günther (12. Dez 2014 um 19:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#12

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19:21
Für so Dinge verwende ich meistens Events (MSDN-Library durchsuchenCreateEvent, MSDN-Library durchsuchenWaitForSingleObject). Die gibt es in den neueren Delphi Versionen glaube ich auch in einer Klasse gekapselt.

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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (12. Dez 2014 um 19:25 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19:25
Grade das macht ja nur Sinn wenn der wartende Thread ("Thread 2") sonst keine Aufgabe hat.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19:25
Zacherl war schneller!

Events...

Und eine Queue mit Locking...
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#15

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19:31
Grade das macht ja nur Sinn wenn der wartende Thread ("Thread 2") sonst keine Aufgabe hat.
Naja, wenn Thread 2 permanent irgendwas macht und nur zwischendurch Daten von Thread 1 verarbeiten soll, dann würde ich vermutlich einfach einen Boolean anlegen, der komplett von Thread 1 kontrolliert wird. Die Daten würde ich dann auch im Thread 1 zwischenlagern (Stream, Queue, etc.). Thread 1 schaut nun während seiner permanenten Aufgabe z.b. einmal pro Loop, ob der Boolean true ist und verarbeitet dann 1-n Pakete aus der Queue.

Edit: Ansonsten kannst du auch Events "peeken", indem du das Timeout von WaitForSingleObject auf 0 setzt und den entsprechenden Rückgabewert auswertest.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (12. Dez 2014 um 19:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19:37
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19:50
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
Edit: Ansonsten kannst du auch Events "peeken", indem du das Timeout von WaitForSingleObject auf 0 setzt und den entsprechenden Rückgabewert auswertest.
Oh. Gute Idee.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 20:11
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 20:15
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 , ich grübel bis morgen das einmal durch. Vielleicht liege ich ja wirklich einfach daneben.

Geändert von Der schöne Günther (12. Dez 2014 um 20:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#20

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 20:27
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.
Klingt für mich, als ob mein Beispiel mit Thread 1 und Thread 2 dafür perfekt geeignet wäre
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 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