QTimer in einem Qthread

Alles rund um die Programmierung mit Qt
Antworten
Rumbert
Beiträge: 48
Registriert: 25. Mai 2009 18:28
Wohnort: Witten

QTimer in einem Qthread

Beitrag von Rumbert »

Hallo NG,

folgendes Problem, ich habe einen QThread der unter gewissen Umständen ein Qtimer startet, so dass ein entsprechender Slot regelmäßig aufgerufen werden soll. Das Problem ist, dass ich dazu eine eigene Eventloop für den Thread starten müsste (exec()). Bei meinem Thread handelt es sich jedoch um eine while-schleife die permanent abgearbeitet werden muss (Siehe Code Schnippsel).

Code: Alles auswählen

void ThreadClass::run()
{

   QTimer* o1_curTimer = new QTimer();

   while(condition)
   {
      // hier wird eine Queue geparts die regelmäßig befüllt wird
      // und dann unter bestimmten umständen wird dann folgender Code ausgeführt ( der Timer wird nicht in jedem Schleifen durchlaiuf gestartet:

      if (NULL != o1_curTimer)
      {
         connect( o1_curTimer, SIGNAL(timeout()),
            this, SLOT(slotMotorCur1()) );

         int zahl = 10;
         o1_curTimer->start(zahl);
      }   
      ...
      msleep(2);
      ...
   }// end while

   if (NULL!=o1_curTimer)
   {
      delete(o1_curTimer);
      o1_curTimer = NULL;
   }
}// end run


void ThreadClass::slotMotorCur1()
{
   qDebug() << "Hier!";
} 
Das Problem ist, dass die Methode slotMotorCur1 nicht aufgerufen wird, da in meiner Run Methode keine eigene Eventloop gestartet wird. Dies ist aber nicht möglich, da ich die schleife ja immer wieder durchlaufen möchte/muss um meine Queue abzuarbeiten.

Hat jemand ne Idee wie ich den QTimer in meinem Thread verwenden kann?

Grüße André
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Nee mom, hab grad bissi Probleme zu lesen, was du mit dem Code machen willst ^^

Aber Frage; du willst zeitversetzt den Slot da immer aufrufen ... oder fuer was brauchst du den timer da ???


Ciao ...
Zuletzt geändert von RHBaum am 26. März 2010 12:01, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie Du schon gesehen hast brauchst Du im Thread eine Eventloop.
Ich habe in Deinem Code noch keine Begründung gesehen warum Du kein exec() ausführen kannst...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Rumbert
Beiträge: 48
Registriert: 25. Mai 2009 18:28
Wohnort: Witten

Beitrag von Rumbert »

@Christian:
soweit ich das verstanden habe, kann ich in der Run Methode entweder ne permanente Whileschleife laufen lassen (bis zu ner Abbruchbedingung halt) ODER ich starte in dem thread ne Eventloop. In letzterem Fall wird beim Aufruf von exec() bist zum beenden der Eventloop die Methode nicht mehr weiter ausgeführt. Ich will aber permanent eine Schleife abarbeiten in der was passeirt. Das heißt ich kann dann ja keine Eventloop starten... oder was meinst Du genau?
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Wieso packst du in deine Schleife kein

if (zeitAbgelaufen)
... slotaurufen

?
Rumbert
Beiträge: 48
Registriert: 25. Mai 2009 18:28
Wohnort: Witten

Beitrag von Rumbert »

@RHbaum
Das Szenario ist, dass ich eine Queue habe, die mit eintreffenden Nachrichten befüllt wird und mit meinem Thread arbeite ich diese Nachrichten aus der Queue permanent ab. Dabei werte ich in meinem Thread die Nachrichten aus und wenn es eine Spezielle Nachicht ist will ich nen Timer Starten der dann in regelmäßigen Abstände Stromwerte ausliest.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann sind das zwei Aufgaben in einem Thread die sich nur gegenseitig stören... ich würde zwei Threads machen und fertig.
Oder die Queue per QTimer alle n Millisekunden pollen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich denke auch dass du die Aufgaben trennen solltest.

Ansonsten (sozusagen als Notlösung) kannst du in deiner run() eine QTime starten und in jeder Runde der while-Schleife elapsed() abfragen und schauen ob das >= mein_timer_intervall ist, und dann deinen SLOT aufrufen und die time restart()en.

Aber wie gesagt machst du hier OOP, und da sollte man schauen dass verschiedene Aufgaben auch in verschiede Klassen gelegt werden.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Dann sind das zwei Aufgaben in einem Thread die sich nur gegenseitig stören... ich würde zwei Threads machen und fertig.
Genau ! nen Timer in nem (Arbeits)Thread, das beisst sich irgendwie :-)
Technisch funktionieren wuerde das sicher, aber Sinn ... ?
Besser aus dem thread raus nen 2. thread aufmachen, und gut iss ....

Ciao ...
Rumbert
Beiträge: 48
Registriert: 25. Mai 2009 18:28
Wohnort: Witten

Beitrag von Rumbert »

Vielen Dank für Eure Hilfe, habe das nun in eine separate Klasse ausgelagert und nun klappts soweit :-)

Grüße André
Antworten