[gelöst] sleep() im Thread führt zu bugs in der GUI

Alles rund um die Programmierung mit Qt
Antworten
german_beaver
Beiträge: 4
Registriert: 15. August 2005 21:05

[gelöst] sleep() im Thread führt zu bugs in der GUI

Beitrag von german_beaver »

Hallo!
Um den Umgang mit Threads zu üben, habe ich ein einfaches Programm geschrieben. Das Programm instanziiert einen "Logger", eine einfache GUI, die aus einer Textbox besteht. Die Logger-Klasse hat die Methode "log()", mit der ein QString in die Textbox ausgegeben werden kann.
Dann wird noch eine von QThread abgeleitete MyThread-Klasse instanziiert, die in regelmäßigen Abständen einen vorgegebenen String in den Logger ausgibt.

Das Problem ist nun, wenn ich sleep() bzw. msleep() Methode benutze um den Thread für eine kurze Zeit schlafen zu legen, dann wird die Ausgabe im Logger mit graphischen Bugs dargestellt, z.B. wird die Ausgabe erst gar nicht angezeigt, bis ich in die Textbox klicke, bzw. danach wird nicht der ganze String sondern nur ein Paar der letzten Buchstaben davon angezeigt. Wenn ich sleep() auslasse, funktioniert alles einwandfrei. Ich habe auch ein Bild angehängt, wo man die graphischen Bugs schön sehen kann.

Es ist schon klar, dass eine so einfache Aufgabe mit QTimer besser gelöst werden kann, aber ich will verstehen, warum das nicht funktioniert. Wäre sehr nett, wenn mir jemand mit diesem kleinen Problem helfen könnte :)

MyThread.h, enthält einen Pointer zu einem Logger und gibt in der run() in einer Schleife in regelmäßigen Abständen einen Text im Logger aus

Code: Alles auswählen

#include <QThread>
#include <QApplication>
#include "Logger.h"

class MyThread : public QThread
{
public:
    Logger* logger;
    
    MyThread(Logger* l)
    {
        logger = l;
    };
    
    void run()
    {
        for(int i = 0; i < 300; i++) {
            logger->log("event");
            msleep(200); // wenn die Zeile auskommentiert ist, geht alles einwandfrei ohne graphische bugs
        }
    };
};
Logger.h, zeigt eine Textbox an und hat eine Methode, mit der ein neuer Text in die Textbox ausgegeben werden kann

Code: Alles auswählen

#ifndef LOGGER_H
#define LOGGER_H

#include <QObject>
#include <QTextEdit>

class Logger : public QObject
{
Q_OBJECT
public:
    QTextEdit* textbox;
    
    Logger();
    ~Logger();
    
    void log(QString s); // Textausgabe
    void log(int value); // Zahlenausgabe
};

#endif
Logger.cpp

Code: Alles auswählen

#include "Logger.h"

Logger::Logger()
{
    textbox = new QTextEdit(0);
    textbox->resize(300,600);
    textbox->show();
}

Logger::~Logger()
{
    delete textbox;
}

void Logger::log(QString event)
{
    textbox->append(event);
}

void Logger::log(int value)
{
    textbox->append(QString::number(value));
}
main.cpp

Code: Alles auswählen

#include <QApplication>
#include "Logger.h"
#include "MyThread.h"


int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    
    Logger* l = new Logger;
    MyThread mt(l);
    mt.start();
    
    return app.exec();
}
Dateianhänge
graphic bugs
graphic bugs
screenshot.jpg (15.48 KiB) 2123 mal betrachtet
Zuletzt geändert von german_beaver am 14. Mai 2006 13:53, insgesamt 1-mal geändert.
german_beaver
Beiträge: 4
Registriert: 15. August 2005 21:05

Beitrag von german_beaver »

Habe das Problem selbst gelöst :roll:
Wenn ich sleep() durch wait() ersetze, funktioniert alles wunderbar. Ich verstehe aber nicht, warum das so ist. sleep() tut doch letzendlich auch nichts anderes, als den Thread zu blocken, oder? Auf jeden Fall, das Problem ist gelöst :D
Zonk
Beiträge: 51
Registriert: 17. September 2006 15:28
Kontaktdaten:

Beitrag von Zonk »

mit sleep blockst du das ganze, ich vermute mal das deshalb auch mit dem repaint etwas schief läuft..
Antworten