Forum: PC-Programmierung Qt Send Message Scheduler


von Thorben (Gast)


Lesenswert?

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?

von Oliver S. (oliverso)


Lesenswert?

Ein Timer mit 100ms und im Slot eine state machine, die in Abhängigkeit 
der abgelaufenen Zeit die richtigen Nachrichten sendet.

Oliver

von Thorben (Gast)


Lesenswert?

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?

von Oliver S. (oliverso)


Lesenswert?

Bei > 1000 Nachrichten nimmt man das gleiche wie bei 4 Nachrichten. 
Wenn’s > 10.000.000 wären, wäre es ein Problem.

Oliver

von Rolf M. (rmagnus)


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

Du brauchst hier keine Threads. Dein I/O ist sicherlich asynchron und 
rechnen musst du auch nichts.

von Florian S. (sevenacids)


Lesenswert?

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?

: Bearbeitet durch User
von Thorben (Gast)


Lesenswert?

>...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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Thorben (Gast)


Lesenswert?

>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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.