Qt Send Message Scheduler

Gast #6411845
Hallo, in meinem Programm benötige ich einen Message Scheduler welcher 
Nachrichten in bestimmten definierten Zeitabständen sendet.

Zyklus (ms) Nachricht (Payload)
100         0x00 0x01 0x00 0x01 0x00
100         0xAA 0xFF 0xAB 0xAC 0x11
200         0x01 0x01 0x01 0x01 0x01
1000        0xFF 0xFF 0xFF 0xFF 0xFF

Ich dachte mir einen Timer mit einem Interval von 100ms zuerstellen und 
im Timeout Slot eine Variable zu erhöhen und die entsprechenden 
Nachrichten zusenden.

Womit ich Verständnisprobleme habe ist, wie ich im Timeout Slot die 
entsprechenden Nachrichten filtere, weil bei T100 müssten zwei 
Nachrichten gesendet werden, dann bei T200 wären es drei Nachrichten und 
bei T1000 wären es vier Nachrichten.

Mir fehlt die Vorstellung und Erfahrung, wie ich das umsetzen kann. Kann 
mir jemand ein Tipp geben? Wäre ein QMultimap hier z.B. sinvoll?
Gast
Wie filtere ich den am besten die Nachrichten, weil mein Beispiel sind 
jetzt 4 Nachrichten, was nimmt man am besten bei >1000 Nachrichten?

Wenn ich die passenden Nachrichten hab übergebe ich diese einem Fifo und 
die Senderoutine im einem QThread sendet dann?
Oliver S. schrieb:
> Bei > 1000 Nachrichten nimmt man das gleiche wie bei 4 Nachrichten.

Naja, bei > 1000 Nachrichten muss man es ggf. schon etwas anders 
angehen. Hier steht leider nicht, um welche Art von Schnittstelle/Bus es 
geht, aber es kann z.B. sinnvoll sein, die Nachrichten einigermaßen 
gleichmäßig zu verteilen, also wenn z.B. 50 Nachrichten alle Sekunde 
gesendet werden müssen, nicht im Zyklus 0, 10, 20 jeweils alle 50 zu 
senden, sondern in Zyklus 0 5 Stück, in Zyklus 1 die nächsten 5 u.s.w., 
damit es nicht immer bestimmte Zyklen gibt, in denen alle 1000 
Nachrichten auf einmal gesendet werden müssen und andere, in denen nur 5 
gesendet werden.
Wozu die festen Zeiten? Bzw. wie sieht denn die Empfängerseite aus? Wenn 
es kein Echtzeitsystem ist, kannst du die Timings beim Empfänger ohnehin 
nicht garantieren, vor allem, wenn da noch andere Nachrichten über den 
Kanal gehen.

Die Nachrichten bei Verfügbarkeit ohne Verzögerung mit Zeitstempel 
verschicken und auf Empfängerseite in einer Queue abarbeiten ist keine 
Option?
Gast
>...um welche Art von Schnittstelle/Bus...

UDP und ich wollte es ähnlich wie beim CAN-Bus machen, deshalb meine 
Frage. Also die wichtigen Nachrichten mit niedrigen Zykluszeiten und die 
etwas unwichtigeren mit hohen Zykluszeiten, trotzdem müssen alle 
Nachrichten zur der Zeit N gesendet werden, wenn die Zykluszeiten ein 
vielfaches ist.

>Die Nachrichten bei Verfügbarkeit ohne Verzögerung mit Zeitstempel
>verschicken und auf Empfängerseite in einer Queue abarbeiten ist keine
>Option?

Das Protokol ist vorgegeben darauf hab ich kein Einfluss.
Thorben schrieb:
>>...um welche Art von Schnittstelle/Bus...
>
> UDP und ich wollte es ähnlich wie beim CAN-Bus machen, deshalb meine
> Frage. Also die wichtigen Nachrichten mit niedrigen Zykluszeiten und die
> etwas unwichtigeren mit hohen Zykluszeiten, trotzdem müssen alle
> Nachrichten zur der Zeit N gesendet werden, wenn die Zykluszeiten ein
> vielfaches ist.

Es geht bei den Zykluszeiten weniger darum, wie wichtig die Daten sind, 
sondern wie schnell sie aktualisiert werden müssen.
Eine Temperatur kann z.B. wichtig sein (Überhitzung = kaputt), ändert 
sich aber in der Regel nicht so schnell, dass es sinnvoll wäre, sie jede 
Millisekunde zu übertragen.

Ein einfacher Weg: Für jede Botschaftsart einen Zähler, der bis n zählt, 
und immer beim Zurücksetzen auf 0 das Senden auslöst, wobei n der 
Quotient aus der Timer-Zykluszeit und der Sende-Zykluszeit ist. Um die 
Botschaften etwas gleichmäßiger zu verteilen, kann man die Zähler mit 
unterschiedlichen Werten vorbelegen.
Gast
>Es geht bei den Zykluszeiten weniger darum, wie wichtig die Daten sind,
>sondern wie schnell sie aktualisiert werden müssen.

Ich stimme Dir zu, meine eigentliche Aussage sollte darauf hinauslaufen 
und war schlecht formuliert.

>Ein einfacher Weg: Für jede Botschaftsart einen Zähler, der bis n zählt,
>und immer beim Zurücksetzen auf 0 das Senden auslöst, wobei n der
>Quotient aus der Timer-Zykluszeit und der Sende-Zykluszeit ist.

Ein sehr interessanter Ansatz, welchen ich mir gerne genauer anschauen 
würde. Kennst du ein Opensourceprojekt, welches ich zur Studie 
heranziehen könnte?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.