Logging in QtextBrowser - Performanceproblem
Verfasst: 26. Dezember 2012 17:30
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:
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.
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:
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?
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");
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");
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:
Noch eine Idee: Konsolenfenster zum Loggen verwenden.QObject::moveToThread: Widgets cannot be moved to a new thread
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?