Hi,
ich probiere mich gerade etwas an Threads aus.
Ich habe eine GUI, die eine TextArea hat und in dieser will ich nun Zahlen hochzählen lassen, flüssig, und dabei nur die Zahl updaten.
Sobald die Zahl an ihrem Maximum ist, will ich mir eine HTML-Datei zusammenstellen.
Leider habe ich folgende Probleme:
1.
Die TextArea scheint Probleme damit zu haben, schnelle Updates entgegen zu nehmen, weswegen ich ein Thread.Sleep(x); einbauen musste. Ab x<24 kommt eine NP-Ex von JavaFX.
Den Parameter habe ich auf 25 eingestellt, dies dauert aber unnötig lange.
2.
Als ich die Zahl hochzählen Methode fertig hatte, habe ich die zweite Methode für die HTML-Datei implementiert. Der Effekt, dass die GUI kontinuierlich geupdatet wurde, verschwand (Leider, denn deswegen habe ich doch erst Threads mit eingebaut).
Je eine Methode läuft in einem seperaten Thread. Als ich debuggt habe, stand ich aber auf einmal im zweiten Thread statt im ersten, was falsch ist, denn die Threads sollten sequentiell ablaufen, da Thread 1 Vorkehrungen/Vorbereitungen für Thread 2 trifft.
Läuft Thread 2 als Erstes, endet das Programm in einem NP-Ex Massaker.
Ein thread.join regelt zwar den Ablauf, unterdrückt aber weiterhin das GUI-Update von Thread 1.
Viel geredet, hier der Code:
Ich hoffe es ist nicht all zu viel.
ich probiere mich gerade etwas an Threads aus.
Ich habe eine GUI, die eine TextArea hat und in dieser will ich nun Zahlen hochzählen lassen, flüssig, und dabei nur die Zahl updaten.
Sobald die Zahl an ihrem Maximum ist, will ich mir eine HTML-Datei zusammenstellen.
Leider habe ich folgende Probleme:
1.
Die TextArea scheint Probleme damit zu haben, schnelle Updates entgegen zu nehmen, weswegen ich ein Thread.Sleep(x); einbauen musste. Ab x<24 kommt eine NP-Ex von JavaFX.
Java:
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:418)
at java.util.ArrayList.get(ArrayList.java:431)
at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306)
at javafx.scene.Parent.updateCachedBounds(Parent.java:1583)
at javafx.scene.Parent.recomputeBounds(Parent.java:1527)
at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1380)
at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078)
at javafx.scene.Node.updateGeomBounds(Node.java:3577)
at javafx.scene.Node.getGeomBounds(Node.java:3530)
at javafx.scene.Node.getLocalBounds(Node.java:3478)
at javafx.scene.Node.updateTxBounds(Node.java:3641)
at javafx.scene.Node.getTransformedBounds(Node.java:3424)
at javafx.scene.Node.updateBounds(Node.java:559)
at javafx.scene.Parent.updateBounds(Parent.java:1711)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Parent.updateBounds(Parent.java:1709)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2404)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException
Den Parameter habe ich auf 25 eingestellt, dies dauert aber unnötig lange.
2.
Als ich die Zahl hochzählen Methode fertig hatte, habe ich die zweite Methode für die HTML-Datei implementiert. Der Effekt, dass die GUI kontinuierlich geupdatet wurde, verschwand (Leider, denn deswegen habe ich doch erst Threads mit eingebaut).
Je eine Methode läuft in einem seperaten Thread. Als ich debuggt habe, stand ich aber auf einmal im zweiten Thread statt im ersten, was falsch ist, denn die Threads sollten sequentiell ablaufen, da Thread 1 Vorkehrungen/Vorbereitungen für Thread 2 trifft.
Läuft Thread 2 als Erstes, endet das Programm in einem NP-Ex Massaker.
Ein thread.join regelt zwar den Ablauf, unterdrückt aber weiterhin das GUI-Update von Thread 1.
Viel geredet, hier der Code:
Code:
private void startCompareTask() {
textAreaV.appendText("Dateien werden eingelesen.\n");
Task task = new Task<Void>() {
@Override
public Void call() throws Exception {
textAreaV.appendText("Bereite Dateien vor.\n");
List<String> listFile1 = StringUtil.fileToLines(file1);
textAreaV.appendText("Unterschiede gefunden : suche");
for (int i = 0; i < listFile1.size(); i++) {
gnrRev.setAreDiff(true);
textAreaV.end();
textAreaV.selectPreviousWord();
textAreaV.replaceSelection(String.valueOf(++counter));
Thread.sleep(5);
}
updateProgress(counter, listFile1.size());
// counter++;
}
if (counter == 0) {
textAreaV.end();
textAreaV.selectPreviousWord();
textAreaV.replaceSelection("Keine");
}
textAreaV.appendText("\nFertig!");
updateMessage("Finished");
return null;
}
};
thCompare = new Thread(task);
thCompare.setDaemon(true);
thCompare.start();
}
Code:
private void startHtmlTask() {
Task task = new Task<Void>() {
@Override
public Void call() throws Exception {
textAreaV.appendText("\nSchreibe HTML-Datei.");
new HtmlBuilder("test", "Test", true).buildAndCreateHtml("einPfad.html");
return null;
}
};
thHtml = new Thread(task);
thHtml.setDaemon(true);
thHtml.start();
}
Code:
@FXML
public void handleClick() throws IOException, InterruptedException {
startCompareTask();
thCompare.join();
startHtmlTask();
}
Ich hoffe es ist nicht all zu viel.