Seite 1 von 1
QThread und sleep problem
Verfasst: 8. April 2011 16:21
von geostein8888
Hallo,
ich habe hier immer noch ein Problem mit sleep bei einem QThread.
selbst eine einfache anwendung, welche nur alle 5sec. etas auf den Schirm schreiben soll, blockiert mir mit sleep die komplette Anwendung (die Ausgabe des threads läuft weiter, nur den stop button der Hauptanwendung kann ich nicht mehr drücken - brauche ich hier ggf. eine event queue?).
Was genau macht sleep eigendlich, ich war der Meinung dass dies den thread schlafen legt und der dann folglich keine LAst mehr erzeugt, nur sieht das bei mir anders aus.
Kann mir ggf. jemand einmal ein beispiel zukommen lassen wie der Thread denn nun aussehne muss? (ich habe ein start im thread, welches das run aufruft, und im run ist dann meine Schleife und das sleep
QTimer kann ich hier aus verschiedenen Gründen nicht benutzen.
Georg
Verfasst: 8. April 2011 16:53
von Christian81
Andersrum - zeig uns ein minimal kompilierbares Beispiel mit dem falschen Verhalten. QThread::sleep() blockiert (wie die Doku auch sagt) den aktuellen Thread. Wenn Du also sleep() aufrufst und gerade im Mainthread bist... naja dann blockiert eben der Mainthread.
Verfasst: 8. April 2011 18:07
von upsala
2. Thread für das selbe Thema und die Fragen vom letzten Thread noch nichtmal beantwortet.
Verfasst: 8. April 2011 18:19
von geostein8888
Hallo,
hier der Code:
msmschedulermanager.h
Code: Alles auswählen
#ifndef MSMSCHEDULERMANAGER_H
#define MSMSCHEDULERMANAGER_H
#include <QThread>
class MSMSchedulerManager : public QThread{
Q_OBJECT
public:
explicit MSMSchedulerManager(QObject *parent = 0);
void stop();
void start();
signals:
void signalChangeSchedulerStatus(QString, QString);
public slots:
private :
volatile bool stopped;
protected:
void run();
};
#endif // MSMSCHEDULERMANAGER_H
msmschedulermanager.h:
Code: Alles auswählen
#include "msmschedulermanager.h"
#include <QDebug>
#include <QDate>
#include <QTime>
#include <QDateTime>
MSMSchedulerManager::MSMSchedulerManager(QObject *parent) : QThread(parent){
}
void MSMSchedulerManager::run(){
qDebug() << "Thread " << QThread::currentThread();
qDebug() << "MSMSchedulerManager: started";
//connect to the scheduler Table with slot/signal
int checkCounter = 0;
while (!this->stopped){
QVariant checkCounterVar = checkCounter;
qDebug() << "MSMSchedulerManager: start check - "<< checkCounterVar.toString();
checkCounter++;
qDebug() << "#### Thread: MSMSchedulerManager: sleep";
sleep(5);
}
}
void MSMSchedulerManager::start(){
this->run();
}
void MSMSchedulerManager::stop(){
this->stopped = true;
qDebug() << "MSMSchedulerManager: stopped";
}
und so wird das ganze im
HauptThread gestartet:
Code: Alles auswählen
this->schedulerManager = new MSMSchedulerManager(this);
this->schedulerManager->start();
Georg
Verfasst: 8. April 2011 18:43
von franzf
Oh Mann....
BITTE lies erst mal die Doku genau durch.
WARUM IMPLEMENTIERST DU START()?!?
run() ist deine Funktion, start() liefert dir schon QThread, dort wird run() in einem eigenen (system-abhängigen) Thread gestartet. Dein start() ruft nur run() auf, und das geschieht im Kontext des aktuellen THreads - deines Hauptthreads.
Lass dein eigenes start() weg, und alles läuft wie es soll.
Verfasst: 8. April 2011 18:55
von solarix
LOL... Es ist schade, wenn du Tipps nicht befolgst.. mit beiden(!) Varianten (Antwort im letzten Foren-Thread) hättest du den Fehler selbst gefunden
solarix hat geschrieben:...
Dann: die msleep(300) blockiert dir den Hauptthread sicher nicht (es sei denn, du rufst "run()" irgendwo noch im Hauptthread auf..). Du kannst aber mit "qDebug() << QThread::currentThread()" relativ gut prüfen, wo du dich in welchem Thread-Kontext befindet.
Weiteres: Falls die Blockaden im GUI-Thread als Anwender gut fühlbar sind, kannst du auch einfach bei der Blockade den Debugger anhalten und siehst dann ja, wo der GUI-Thread blockiert wird..
Verfasst: 8. April 2011 19:22
von geostein8888
Hallo,
erst einmal Danke für die tipps, das mit dem start hab ich total missverstanden beim letzten mal, hatte mir aber auch schon gedacht dass ich einen total blöden Fehler gemacht hab.
Auf jeden Fall klappt das hier jetzt wie es soll
Georg