Seite 1 von 1

Logging in QtextBrowser - Performanceproblem

Verfasst: 26. Dezember 2012 17:30
von Caber
Ich habe mir eine Singleton-Klasse zum Loggen programmiert. Alle Aktionen meines Programms werden darin bei Bedarf mitgeloggt und in einem QtextBrowser angezeigt.
Leider werden manchmal recht viele Aktionen pro Sekunde ausgeführt, so dass das gesamte Hauptprogramm hängt (für mehrere Sekunden).
Die Ursache vermute ich im Parsing des QtextBrowsers.
Ursprünglich sah der Code so aus:

Code: Alles auswählen

text.append(newText);
qDebug() << "vor  " << QDateTime::currentDateTime().toString("z");
ui->textBrowser->setText(text);
qDebug() << "nach " << QDateTime::currentDateTime().toString("z");
Für den setText hat sich der textBrowser 200 ms gegönnt, wie ich in der qDebug-Ausgabe sehen konnte.
Besser wurde es, als ich die Methode insertHtml verwendet habe. Es dauerte somit nur noch 50ms, da der neue Text an der stelle des Cursors eingefügt wird, und nicht der gesamte Text geparst wird.

Code: Alles auswählen

qDebug() << "vor  " << QDateTime::currentDateTime().toString("z");
ui->textBrowser->insertHtml(newText); 
qDebug() << "nach " << QDateTime::currentDateTime().toString("z");
Das ist aber noch zu lang. Wie gesagt werden manchmal sehr viele Zeilen pro Sekunde eingefügt. Zum Beispiel 100 Zeilen mal 50 ms sind 5 Sekunden, in der das Hauptprogramm hängt.

Meine nächste Idee war, die Logging-Klasse in einen eigenen Thread zu packen. Leider ist sie ein QWidget und somit nicht in einenThread verschiebbar.
Fehlermeldung des Compilers:
QObject::moveToThread: Widgets cannot be moved to a new thread
Noch eine Idee: Konsolenfenster zum Loggen verwenden.
Endlich gibt es keine Performance-Probleme mehr.

Aber dafür folgende Nachteile, jedenfalls habe ich keine Lösungen bisher gefunden:
- Konsolenfenster startet immer mit dem Hauptprogramm
- Konsolenfenster nur ausschaltbar, indem man es im Project-File herausnimmt und neu kompiliert
- keine farbigen Schriftarten

Habt Ihr Ideen, wie man das noch lösen könnte?

Re: Logging in QtextBrowser - Performanceproblem

Verfasst: 26. Dezember 2012 19:21
von -=Freaky=-
koenntest du vllt. einen logger in einem separaten thread laufen lassen, der den text nur irgendwie speichert? dann kannst du in der gui alle 200ms oder so (timer?) von diesem thread den aktuellen logging-text abfragen und setzen (natuerlich drauf achten dass es keine race condition gibt). so entlastest du die gui, und fuer das auge ist vermutlich kein unterschied erkennbar.

wenn du eine "logger" gui-komponente haben willst, kannst du ja z.b. von QTextBrowser ableiten und den timer usw. darin verstecken, und die moeglichkeit geben an eine "logger thread"-instanz anzubinden.

Re: Logging in QtextBrowser - Performanceproblem

Verfasst: 26. Dezember 2012 21:41
von Christian81
QTextBrowser ist einfach nicht für so viel Ausgaben in der Sekunde konzipiert - maximal QPlainTextEdit ist für sowas geeignet aber auch hier - wer soll so schnell das Zeug lesen? Hatten wir auch schon öfter hier im Forum - einfach mal SuFu benutzen.

Re: Logging in QtextBrowser - Performanceproblem

Verfasst: 26. Dezember 2012 23:34
von Caber
QPlainTextEdit ist tatsächlich um ein Vielfaches schneller als QtextBrowser und auch schnell genug für mich. Es zeigt sogar automatisch die neueste Ausgabezeile. Vorher musste ich umständlich über den Cursor an das Ende springen.
Hätte nicht gedacht, dass es bei den Qt Widgets so große Unterschiede in der Performance gibt. Vielen Dank! Wo kann ich den Thread als gelöst markieren?