GUI thread und pthread
Verfasst: 20. Juli 2009 17:11
In meinem Programm nutze ich ein TableWidget als Trackertabelle für ein Spiel. Während dieser sich auf Knopfdruck aktualisiert (ca. 15 Sekunden), soll die GUI aber nicht stoppen, sondern den Tracker so lange verstecken, bis er fertig ist. Dabei soll die GUI weiterhin reagieren können.
Das ist ein Auszug der Klassendeklaration:
Wenn der Tracker per Button aktualisiert wird, wird folgende Funktion aufgerufen:
Der Thread, der gestartet wird, führt also folgende Funktion aus:
Dabei wird in der ersten Zeile die Kommunkation zwischen den Servern geregelt. Allerdings in der zweiten Zeile (mit dem "emit"), die nur ein Signal auslöst, das den Tracker wieder mit der Funktion "show()" zeigen soll, meckert Qt während der Laufzeit rum, dass ich nicht mit dem GUI-Thread arbeiten würde. Sobald ich das emit rausnehme, kommen keine Warnungen.
Ich habe extra den pthread und das Signal erstellt, damit ich genau solche Warnungen vermeiden kann.
Das Signal wurde in qd321go::setupUi() folgendermaßen connected:
Was habe ich falsch gemacht?
Das ist ein Auszug der Klassendeklaration:
Code: Alles auswählen
class qd321go : public QMainWindow
{
Q_OBJECT
...
public:
...
pthread_t tracker_thread;
ServerTracker tracker; // tracker (eigene Klasse)
public slots:
void start_refresh();
void show_tracker();
...
signals:
void tracker_refreshed();
};
Code: Alles auswählen
void qd321go::start_refresh()
{
if ( pthread_create(&tracker_thread, NULL, ServerTracker::thread_start, this) != 0 )
{
msg_box("Error", "Thread error!"); // msg_box ist ein define
return;
}
tracker.hide(); // tracker wird versteckt
pb_refresh.setEnabled(false); // Aktualisierungsknopf disablen
}
Code: Alles auswählen
void* ServerTracker::thread_start(void* p)
{
((qd321go*)p)->tracker.refresh();
emit ((qd321go*)p)->show_tracker();
}
Ich habe extra den pthread und das Signal erstellt, damit ich genau solche Warnungen vermeiden kann.
Das Signal wurde in qd321go::setupUi() folgendermaßen connected:
Code: Alles auswählen
QObject::connect(this, SIGNAL(tracker_refreshed()), this, SLOT(show_tracker())); // show_tracker() ruft tracker.show() auf