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
QThread und sleep problem
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
geostein8888
- Beiträge: 50
- Registriert: 16. März 2011 08:25
Hallo,
hier der Code:
msmschedulermanager.h
msmschedulermanager.h:
und so wird das ganze im HauptThread gestartet:
Georg
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_HCode: 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";
}
Code: Alles auswählen
this->schedulerManager = new MSMSchedulerManager(this);
this->schedulerManager->start();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.
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.
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..
-
geostein8888
- Beiträge: 50
- Registriert: 16. März 2011 08:25