QThread und sleep problem

Alles rund um die Programmierung mit Qt
Antworten
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

QThread und sleep problem

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

2. Thread für das selbe Thema und die Fragen vom letzten Thread noch nichtmal beantwortet.
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

Beitrag 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
Antworten