Qt Signal



  • Hey Leute,

    ist es möglich ein Signal public zu machen? Also ich würde gern in einer Klasse das Signal emitten und wenn es emmitet wird in einer anderen Klasse nutzen.

    Geht das, wenn ja wie bekomme ich ein Signal public, da Signale ja protected sind.



  • könntest es mal mit "friend" probieren. oder das signal durch nen event ersetzen.



  • Elec schrieb:

    Also ich würde gern in einer Klasse das Signal emitten und wenn es emmitet wird in einer anderen Klasse nutzen.

    Du willst nach dem emitten das Signal NUTZEN? Wie stellst du dir das vor? Und was soll das in der anderen Klasse bewirken? Sei mal genauer.

    Generell kann man ganz ohne friend o.Ä. Signale von außen auslösen -> QMetaObject::invokeMethod(). (falls das deine Intention war)



  • Also ich hab ne QThread Klasse und ne View.
    In der View kann dann ein Button gedrückt werden "Pause" und dieser soll dann den Thread anhalten. Der Knopf hat nen Slot der dann das Signal emittet. Wie kann ich dann in der Thread Klasse auf das Signal zugreifen?

    Was ist friend?



  • Elec schrieb:

    Also ich hab ne QThread Klasse und ne View.
    In der View kann dann ein Button gedrückt werden "Pause" und dieser soll dann den Thread anhalten. Der Knopf hat nen Slot der dann das Signal emittet. Wie kann ich dann in der Thread Klasse auf das Signal zugreifen?

    Indem du deiner Thread-Klasse einen SLOT spendierst und ihn mit dem SIGNAL verbindest. Qt-Basics.



  • Aber ich kann doch nicht im Thread das definierte Signal in der View verwenden. Das ist ja mein Problem.



  • Elec schrieb:

    Aber ich kann doch nicht im Thread das definierte Signal in der View verwenden. Das ist ja mein Problem.

    connect(view, SIGNAL(anhaltenKnopfGedrueckt()), thread, SLOT(anhalten()));
    

    Aber generell könntest du auch direkt das clicked() des Knopfes auf das anhalten() des threads connecten.



  • Das habe ich auch schon probiert.

    also connect(view->button_pause, SIGNAL(clicked()), this, SLOT(pause_thread()));

    Da bekomm ich nen Segm. fault. Obwohl ich vorher auch das alles initialisiert habe.

    Hier mal bissl Code:
    View:

    void StatisticsViewDialog::pause_active(){
    	emit pause_activated();
    }
    
    StatisticsViewDialog::StatisticsViewDialog(QWidget *parent) : QDialog(parent) {
    /*
     * Code
     */
    connect(button_pause, SIGNAL(clicked()), this, SLOT(pause_active()));
    }
    

    Thread:

    void StartMainThread::pause_thread(){
    	this->mutex.lock();
    }
    
    StartMainThread::StartMainThread(QObject *parent) : QThread(parent)
    {
     // connect(view, SIGNAL(pause_activated()), this, SLOT(pause_thread()));
     // an der Stelle hängt es bzw weiß ich nicht weiter
    }
    
    void StartMainThread::run(){
    /*
     *  run Methode
     *\
    }
    


  • Dann gib mal dem connect auf das pause_thread ein Qt::QueuedConnection mit (5. Parameter des connect) - hilft das?



  • connect(view->button_paused, SIGNAL(pause_activated()), this, SLOT(pause_thread()), Qt::QueuedConnection);
    

    funktioniert auch nicht. kommt auch seg fault



  • Elec schrieb:

    funktioniert auch nicht. kommt auch seg fault

    Dann wäre ein Backtrace nicht schlecht (gibt dir der debugger). Vielleicht kommst du dann ja selber drauf.
    Dein komplettes Projekt (mindestens aber die involvierten Klassen) wären jetzt nicht schlecht - denn der bisher gepostete Code ist für weitere Aussagen zu wenig 😉



  • Okay jetzt geht es, also hab meine View mal wo anders initialisiert.
    Jedoch ist jetzt das Problem wenn ich den Pause Knopf drücke, das es meine ganze GUI einfriert und ich nichts mehr drücken kann.
    Ich dachte mutex.lock(); pausiert den thread erstmal und mutex.unlock(); gibt wieder frei bzw. führt ihn weiter fort dann.
    Lieg ich da falsch?



  • Eine Mutex zu locken ist GANZ was anderes, als einen Thread schlafen zu legen. Die Mutex stellt sicher, dass einen bestimmten Abschnitt nur EIN Thread gleichzeitig betreten kann. Ist die Mutex gelockt und ein weiterer Aufruf kommt an diese Mutex, dann wartet er, bis die Mutex wieder per unlock() vom blockierenden Thread freigegeben ist.
    Du blockierst die Mutex, hängst dich fest auf immer und ewig...

    Um eine bessere Lösung anbieten zu können, bräuchte es deine run().

    Und eine kleine Einschätzung zum Schluss: Ich denke, es ist keine gute Idee, bei deinem aktuellen Kenntnisstand schon mit Threads anzufangen. Da gibt es einfach zu viele neue Fallstricke, die man beachten muss.


Anmelden zum Antworten