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
Der schöne Günther

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

AW: Dinge in meinen Thread queuen

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

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

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 18: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 18: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
 
#3

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 18: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.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 18: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
 
#5

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19: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.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19: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 19:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Dinge in meinen Thread queuen

  Alt 12. Dez 2014, 19: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

 

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 09:06 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