Seite 1 von 2

[gelöst]Thread und Signal

Verfasst: 3. September 2007 11:17
von dl4dz
Hallo Zusammen,

bei mir "hängt's" mal wieder...
Ich habe einen "Thread" der gut funktioniert. Meine Frage:

Gibt es eine Möglichkeit, dass - wenn der Thread beendet ist - er ein "Signal" sendet?
Irgendwas mit QSignal vielleicht? Was muss ich wie und wo machen?

Code: Alles auswählen


class morse_out : public QThread { 
 public: 
   morse_out( std::string a = "morse_out" ); 
   virtual void run(); 
 private: 
   std::string name; 
 }; 
 

Code: Alles auswählen


void morse_out::run(){ 

// Hier steht der Code ...

 } 
 

Code: Alles auswählen


void cw_trainerWidget::lineEditInput_returnPressed() 
      { 
        a.start();               // start thread 
      } 
 
void cw_trainerWidget::threadBeendet()                         <<<========
     {
       // Damit ich hier weitermachen kann
     }



Vielen Dank im Vorraus

Olaf

Re: Thread und Signal

Verfasst: 3. September 2007 11:26
von macman
dl4dz hat geschrieben:Irgendwas mit QSignal vielleicht? Was muss ich wie und wo machen?
Doku lesen.
http://doc.trolltech.com/4.3/qthread.html#finished

Verfasst: 3. September 2007 11:39
von dl4dz
Hallo,

Danke für die Antwort. Ich benutze aber noch QT 3. Da gibt es das Signal "finished()" noch nicht. finished() ist hier "BOOL".

Olaf

Verfasst: 3. September 2007 11:58
von macman
Schön das Du Qt3 noch erwähnst. Da es das Signal noch nicht gibt, erstell Dir selber eins und emittiere es, wenn dein Thread fertig ist. Sind ja nur zwei zusätzliche Zeilen in deinem Code.

Verfasst: 3. September 2007 12:18
von dl4dz
Ja, das Problem ist nur WIE und WO.
Ich habe bislang noch nicht viel mit QT gemacht, bin also ein Anfänger und habe noch nichts dazu gefunden, was ich verstehe.

Gruß Olaf

Verfasst: 3. September 2007 12:56
von macman
Das Wie wird sehr gut in der Doku erklärt, passende Beispiele gibt es auch.
http://doc.trolltech.com/3.3/signalsandslots.html
Und das Wo? Du wirst ja wohl wissen wann dein Thread fertig ist. Als letzter Befehl kommt dann eben ein emit mySignal(); rein.

Verfasst: 3. September 2007 13:33
von dl4dz
Danke für den Hinweis. Ich habe die Seite studiert.

Soviel weiß ich jetzt. Signals und Slots funktionieren nur bei "Objekten". Mein "Thread" ist aber kein Objekt. Also ist auch erst mal nix mit "Signals".

Und nun?

Sorry, wenn ich mich etwas blöde anstelle...

Olaf

Verfasst: 3. September 2007 16:59
von dl4dz
Hallo Zusammen nochmal,

ich habe in der Zwischenzeit etwas im Internet gestöbert. So wie ich es jetzt sehe, brauche ich ein "CustomEvent".

Aber leider war ich auch hier (noch) nicht erfolgreich in der Erstellung. Kann mir jemand weiterhelfen? Wie erwähnt, ich bin quasi Anfänger.

Danke schon mal im Vorraus

Olaf

Verfasst: 3. September 2007 18:33
von Christian81
Einfach hier das Beispiel anschauen: http://doc.trolltech.com/3.3/qcustomevent

Signals&Slots gehen unter Qt3 noch nicht threadübergreifend. Aber warum benutzt du überhaupt Qt3?

Verfasst: 3. September 2007 19:11
von dl4dz
Hallo Christian,

Danke für Deine Antwort.

Ich habe mir das Beispiel angesehen. Das Problem ist...Ich verstehe es einfach nicht. Ich bräuchte mal ganz konkrete Hilfe
Was muss ich wo in meinem Code (siehe oben) ergänzen?

Gruß

Olaf

Verfasst: 4. September 2007 13:46
von dl4dz
Hallo Zusammen,

ich habe mich nochmal mit dem QT Beispiel auseinandergesetzt. Ich verstehe es jetzt fast. Nur eine Sache fehlt mir noch...

WER ist der "receiver" und WAS muss an dieser Stelle stehen, wenn im Beispiel, ein Event empfangen werden soll???

Hier das Beispiel...

Code: Alles auswählen


  class ColorChangeEvent : public QCustomEvent
    {
    public:
        ColorChangeEvent( QColor color )
            : QCustomEvent( 65432 ), c( color ) {}
        QColor color() const { return c; }
    private:
        QColor c;
    };

    // To send an event of this custom event type:

    ColorChangeEvent* ce = new ColorChangeEvent( blue );
    QApplication::postEvent( receiver, ce );  // Qt will delete it when done    <<<<======

    // To receive an event of this custom event type:                                     <<<<======

    void MyWidget::customEvent( QCustomEvent * e )
    {
        if ( e->type() == 65432 ) {  // It must be a ColorChangeEvent
            ColorChangeEvent* ce = (ColorChangeEvent*)e;
            newColor = ce->color();
        }
    }

Danke schon mal im Vorraus

Olaf

Verfasst: 4. September 2007 13:56
von Christian81
Der Receiver ist fderjenige Thread der das Event empfangen soll. In deinem Fall wohl der Main-/Gui-Thread. D.h. Du musst deinem erzeugten Thread einen Pointer auf den Mainthread übergeben.

Verfasst: 5. September 2007 10:08
von dl4dz
Ich hab's FAST, sehe aber vermutlich gerade den "Wald vor lauter Bäumen" nicht.

Soweit bin ich jetzt:

Meine Thread Klasse:

Code: Alles auswählen


class morse_out : public QThread
{
public:
           void run();
           void setTargetWidget(QWidget *widget);

  private:
          QWidget *targetWidget;
 };



Mein Thread:

Code: Alles auswählen


void morse_out::run(){

......
......

QApplication::postEvent(targetWidget,new QCustomEvent(1001));
}



mythread ist vom typ morse_out im Konstruktor vom "cw_trainerWidget"

Code: Alles auswählen

cw_trainerWidget::cw_trainerWidget.....etc, etc
{

mythread.setTargetWidget(this);

}
Beim Kompillieren erhalte ich dann die Meldung:

undefined reference to ' morse_out::setTargetWidget(QWidget*)

Was läuft hier schief?????

Gruß

Olaf

Verfasst: 5. September 2007 10:11
von Christian81
Und was hat ein simpler Compilerfehler jetzt mit dem Problem zu tun? Wo ist der Body von setTargetWidget(QWidget *widget) ??

Verfasst: 5. September 2007 10:42
von dl4dz
OK, hast Recht. Den hatte ich vergessen zu erstellen. Aber dann fehlt noch eine Kleinigkeit. Was muss im Body stehen????

Body:

Code: Alles auswählen

morse_out::setTargetWidget(QWidget *widget)
{

    //   Was muss HIER jetzt stehen????

}

Gruß

Olaf