Logging in QtextBrowser - Performanceproblem

Verschiedenes zu Qt
Antworten
Caber
Beiträge: 4
Registriert: 20. Dezember 2012 11:30

Logging in QtextBrowser - Performanceproblem

Beitrag 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?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Re: Logging in QtextBrowser - Performanceproblem

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

Re: Logging in QtextBrowser - Performanceproblem

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
Caber
Beiträge: 4
Registriert: 20. Dezember 2012 11:30

Re: Logging in QtextBrowser - Performanceproblem

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