Seite 1 von 1

QTimer in einem Qthread

Verfasst: 26. März 2010 11:38
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é

Verfasst: 26. März 2010 11:54
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 ...

Verfasst: 26. März 2010 11:58
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...

Verfasst: 26. März 2010 12:28
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?

Verfasst: 26. März 2010 12:31
von pfid
Wieso packst du in deine Schleife kein

if (zeitAbgelaufen)
... slotaurufen

?

Verfasst: 26. März 2010 12:34
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.

Verfasst: 26. März 2010 12:36
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.

Verfasst: 26. März 2010 12:43
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.

Verfasst: 26. März 2010 13:39
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 ...

Verfasst: 26. März 2010 16:42
von Rumbert
Vielen Dank für Eure Hilfe, habe das nun in eine separate Klasse ausgelagert und nun klappts soweit :-)

Grüße André