Der effizienteste Weg, um Nachrichten in JavaFX TextArea über Threads mit einfachen benutzerdefinierten Logging-Frameworks zu protokollieren

8

Ich habe ein einfaches benutzerdefiniertes Protokollierungs-Framework wie folgt:

%Vor%

Nun möchte ich es erweitern, damit es die Protokollierung von Nachrichten über Threads korrekt verarbeiten kann. Ich habe versucht Lösungen wie Nachrichtenwarteschlangen mit einem AnimationTimer zu verwenden. Es funktioniert, aber es verlangsamt die GUI.

Ich habe auch versucht, einen geplanten Dienst zu verwenden, der einen Thread ausführt Das liest Nachrichten aus der Nachrichtenwarteschlange, verknüpft sie und hängt sie an TextArea an ( textArea.appendText(stringBuilder.toString()) ). Das Problem besteht darin, dass das TextArea-Steuerelement instabil wird, d. H. Sie mussten alle Texte mit Ctrl-A markieren und die Größe des Fensters ändern, damit es gut angezeigt wird. Es gibt auch einige von ihnen, die in einem hellblauen Hintergrund angezeigt werden, nicht sicher, was sie verursacht. Meine erste Vermutung ist, dass die Race-Bedingung es dem Steuerelement möglicherweise nicht erlaubt, sich gut von den neuen Strings zu aktualisieren. Es ist auch erwähnenswert, dass die TextArea um ein ScrollPane gewickelt ist, so dass es Verwirrung stiftet, wenn TextArea tatsächlich das Problem oder ScrollPane ist. Ich muss auch erwähnen, dass dieser Ansatz das TextArea-Steuerelement nicht dazu bringt, sich selbst mit Nachrichten schnell zu aktualisieren.

Ich dachte über binding TextArea.TextProperty() an etwas, das das Update macht, aber ich bin mir nicht sicher, wie ich das richtig machen würde, wenn ich weiß, dass der Sammler von Nachrichten (sei es durch einen Dienst oder ein einsamer Thread) immer noch sein würde läuft anders als der GUI-Thread.

Ich habe versucht, auf andere bekannte Logging-Framework-Lösungen wie log4j und einige Sachen zu referenzieren. hier , aber keiner von ihnen scheint einen offensichtlichen Ansatz für die Protokollierung über Threads in TextArea zu bieten. Ich mag auch nicht die Idee, mein Logging-System darauf zu bauen, da sie bereits ihre vordefinierten Mechanismen wie Logging-Level, etc. haben.

Ich habe gesehen auch. Es impliziert die Verwendung von SwingUtilities.invokeLater(Runnable) , um das Steuerelement zu aktualisieren, aber ich habe bereits einen ähnlichen Ansatz mit javafx.application.platform.runLater() versucht, der im Worker-Thread ausgeführt wird. Ich bin mir nicht sicher, ob ich etwas falsch gemacht habe, aber es hängt einfach. Es kann Nachrichten produzieren, aber nicht, wenn sie aggressiv genug sind. Ich schätze, dass der Worker-Thread, der auf eine rein synchrone Art und Weise läuft, tatsächlich ungefähr 20 oder mehr durchschnittliche Zeilen pro Sekunde und mehr erzeugen kann, wenn er sich im Debug-Modus befindet. Eine mögliche Problemumgehung wäre das Hinzufügen von Nachrichtenwarteschlangen, aber das macht keinen Sinn mehr.

    
konsolebox 09.06.2014, 08:58
quelle

1 Antwort

15

log-view.css

%Vor%

LogViewer.java

%Vor%     
jewelsea 10.06.2014, 11:50
quelle