Qt-Timer können nicht von einem anderen Thread gestoppt werden

8

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%     
Matt 20.10.2014, 09:00
quelle

3 Antworten

6

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.

    
nnb 20.10.2014 10:43
quelle
5

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

erstellen und initialisieren %Vor%

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
  • So wird SingleTimer::SingleTimer nutzlos und Sie brauchen keine SingleTimer Klasse mehr
UmNyobe 20.10.2014 12:19
quelle
0

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%     
Matt 21.10.2014 06:04
quelle