QThread Problem
-
Hi,
ich habe ( mal wieder ) ein Problem wo ich gar nicht weiter komme und im Netz irgendwie nix finde. Mal folgendes kleiner Programm
class MyWindow : public QMainWindow, public QThread{ public: MyWindow() :infoWidget(new QWidget()),connections(new QLabel()){ initLayout(); connections->setText("Empty"); setCentralWidget(infoWidget); QThread::start(); } protected: void run(void){ for(int i = 0; i < 100; i++){ std::stringstream stream; stream<<"connections : "<<i; std::cout<<stream.str()<<std::endl; connections->setText(stream.str().c_str()); } } void initLayout(void){ BorderLayout *layout = new BorderLayout; layout->addWidget(connections,BorderLayout::East); infoWidget->setLayout(layout); } private: QWidget *infoWidget; QLabel *connections; };
Ich möchte in der Methode run() ( die ein einem Thread laufen soll ) den Text vom QLabel connections ändern, was aber überhaupt nicht will, ich bekomme als Meldung
QObject: Cannot create children for a parent that is in a different thread.
Kurz und knapp : Hilfe !!!!
-
1. Qt 4.x oder 3.x?
2. Hast du die Multithreading Dokumentation gelesen?
3. Die Aussage der Fehlermeldung ist eindeutig.
4. Du solltest nicht GUI in einen separaten Thread legen. GUI sollte immer im Hauptthread geschehen.
Trenne die GUI-Elemente von MyWindow von der Berechnung in einem Thread. In der neuen Threadklasse kannst du dann Events losschicken, die von der Windowklasse gefangen werden. Oder du machst in der Windowklasse einen setText(QString text) slot und ein entsprechendes Signal im Thread und verbindest diese.
-
Hi,
das obige Beispiel ist nun ( ehrlich gesagt ) mehr als sinnlos. Mir ist die Fehlermeldung schon klar, ich will nun das es geht. Mal so grob was ich eigentlich will.
Ich habe ein Server Programm laufen. Ich will nun eine GUI haben, die mir die Anzahl der Verbindungen auf dem Server anzeigt usw. usw. usw.
In der GUI habe ich QLabels mit Bezeichnungen wie
- Anzahl Verbindungen
- Belegter Speicher
- usw. usw.Ich muss mir nun immer die Daten vom Server holen, also ein Thread ( damit die GUI nicht blockiert ) und diese Funktion heisst run ( oder wie auch immer ). Ich hole mir die Daten nun, und will diese nun in der GUI anzeigen in den Labels.
also
[code]
void run(void){
// Hole Daten vom Server und setze setze nun die Daten in die QLabels
}
[/cod]Wie kann ich nun aus dem Thread heraus, den Text von einem QLabel ( der im MainThread ) vorhanden ist ändern ?
1. Qt 4.x oder 3.x?
Qt 4
3. Die Aussage der Fehlermeldung ist eindeutig.
Ich weiß, aber wie gesagt, ich will in einem Thread etwas machen und das Ergebnis in der GUI anzeigen.
-
Schick ein Event an den GUI Thread oder ein Signal. Früher konnte man nur Events schicken. Inzwischen geht auch ein Signal.