Hy,
Ich schreibe mein erstes Qt-Programm und bekomme jetzt Probleme mit:
QObject :: killTimer: Timer können nicht von einem anderen Thread gestoppt werden
QObject :: startTimer: Timer können nicht von einem anderen Thread gestartet werden
Mein Programm wird mit einem CANOpen-Bus kommunizieren, für den ich den Canfestival-Stapel verwende. Das Canfestival wird mit Callback-Methoden arbeiten. Um Timeout in der Kommunikation zu erkennen, habe ich eine Timerfunktion eingerichtet (irgendwie wie ein Watchdog). Mein Timer-Paket besteht aus einem "tmr" -Modul, einem "TimerForFWUpgrade" -Modul und einem "SingleTimer" -Modul. Das "tmr" -Modul war ursprünglich C programmiert, so dass die statischen "TimerForFWUpgrade" -Methoden es verbinden. Das "tmr" -Modul wird Teil eines C-programmierten Firmware-Aktualisierungspakets sein.
Der Timer funktioniert wie folgt. Bevor eine Nachricht gesendet wird, rufe ich die TMR_Set-Methode auf. Ein dann in meinem Leerlauf Programmschleife mit TMR_IsElapsed prüfen wir auf einen Timer-Unterlauf. Wenn TMR_IsElapsed, werde ich die Fehlerbehandlung durchführen. Wie Sie sehen, wird die TMR_Set-Methode kontinuierlich aufgerufen und der QTimer immer wieder neu gestartet.
Die oben genannten Fehler treten auf, wenn ich mein Programm starte. Können Sie mir sagen, ob mein Konzept funktionieren könnte? Warum erscheinen diese Fehler? Muss ich zusätzliche Threads (QThread) zum Haupt-Thread verwenden?
Danke
Matt
Lauf- und Leerlaufschleife:
%Vor%Modul tmr (Schnittstelle zum C-Programm):
%Vor%Modul TimerForFWUpgrade:
%Vor%Modul SingleTimer:
%Vor% Verwenden Sie QTimer
für diesen Zweck und verwenden Sie SIGNALS
und SLOT
, um den oder die Timer aus verschiedenen Threads zu starten und zu stoppen. Sie können das Signal von einem beliebigen Thread ausgeben und es in dem Thread fangen, der den Timer erstellt hat, um darauf zu reagieren.
Da du sagst, dass du neu bei Qt bist, schlage ich vor, dass du ein paar Tutorials durchführst, bevor du weitermachst, damit du weißt, was Qt zu bieten hat und nicht am Ende das Rad neu erfinden willst. :)
VoidRealms ist ein guter Ausgangspunkt.
Sie haben dieses Problem, weil die Timer im statischen Array in Thread X
erstellt, aber in Thread Y
gestartet und gestoppt werden. Dies ist nicht erlaubt, weil Qt auf die Thread-Affinität für Timeout-Timer angewiesen ist.
Sie können entweder erstellen, im selben Thread starten oder das Signal und die Slots verwenden, um die Operationen start
und stop
für Timer auszulösen. Die Lösung von Signal und Slot ist ein wenig problematisch, weil Sie n
QTimer-Objekte haben (Tipp: Wie starten Sie den Timer an der Position i
?)
Sie können stattdessen den Timer an der Position tmrnbr
in
wird vom selben Thread ausgeführt.
Außerdem benötigen Sie keine SingleTimer
-Klasse. Sie verwenden Qt5, und Sie haben bereits alles, was Sie benötigen:
SingleTimer::isElapsed
ist wirklich QTimer::remainingTime() == 0
; SingleTimer::set
ist wirklich QTimer::setSingleShot(true); QTimer::start(time);
SingleTimer::slot_setElapsed
wird unbrauchbar SingleTimer::SingleTimer
nutzlos und Sie brauchen keine SingleTimer
Klasse mehr Ich habe die Fehler behoben, nachdem ich mein Timer-Konzept geändert habe. Ich verwende mein SingleTimer-Modul nicht mehr. Vor dem QTimer werde ich keine Auszeit lassen und vielleicht deswegen Probleme bekommen. Jetzt habe ich einen zyklischen QTimer, der alle 100ms in der Slot-Funktion abläuft. Ich werde dann die Ereignisse zählen. Unter meinem Arbeitscode:
%Vor%Tags und Links c++ qt multithreading qthread qtimer