[gelöst] sleep() im Thread führt zu bugs in der GUI
Verfasst: 12. Mai 2006 21:24
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
Logger.h, zeigt eine Textbox an und hat eine Methode, mit der ein neuer Text in die Textbox ausgegeben werden kann
Logger.cpp
main.cpp
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
}
};
};
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
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));
}
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();
}