[gelöst]Thread und Signal

Alles rund um die Programmierung mit Qt
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

[gelöst]Thread und Signal

Beitrag 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
Zuletzt geändert von dl4dz am 14. September 2007 20:31, insgesamt 1-mal geändert.
Es gibt nichts Gutes, ausser man tut es...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: Thread und Signal

Beitrag 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
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und was hat ein simpler Compilerfehler jetzt mit dem Problem zu tun? Wo ist der Body von setTargetWidget(QWidget *widget) ??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dl4dz
Beiträge: 20
Registriert: 30. April 2006 12:26

Beitrag 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
Es gibt nichts Gutes, ausser man tut es...
Antworten