invokeLater wird doch immer ausgeführt, oder?

Status
Nicht offen für weitere Antworten.

spacegaier

Mitglied
Hallo zusammen,

bei meinem Programm, dass die Millionen von Eintragen einliest (siehe weitere Threads in diesem Unterforum), gibt es noch ein kleines Problem.

Während dem Einleseprozess, der mehr als 17 Sekunden dauert, wird ein endlicher Ladebalken (also einer mit Prozentangaben) angezeigt. Wenn die Anzahl der Einträge in der Datei groß ist (also z.B 1.Million), dann klappt das ganze fast perfekt (fast heißt, dass der Ladebalken sich in den ersten 2 Sekunden [Schätzung!] nicht bewegt und dann auf 2% springt, d.h. auf ca. 16.000 eingelesene Einträge, und dann normal weiterläuft).

Damit wären wir auch schon beim Problem: Wenn ich jetzt eine Datei mit z.B. nur 50 Einträgen einlese, sind die Einträge eingelesen, obwohl der Ladebalken erst bei ein paar Prozent steht. Das Updaten des Ladebalkens wird aber mittels eines invokeLater gemacht -> wenn das Einladen fertig ist müsste doch der Ladebalken noch auf 100% gefüllt werden, oder?

Ich habe im Code drei Standardausgaben eingaubt. Seht euch das erst mal an:

Code:
public void run(JProgressBar progress, File file, JLabel labelPrices) 
	{ 
		final int bytesReadForLinecount = 20;
		int current = 0;

		status = progress; 

		BufferedReader br = null;
		
		try
		{
			try 
			{
				br = new BufferedReader(new FileReader(file));
				try
				{
					br.mark(bytesReadForLinecount);
				}
				catch(IOException e) 
				{
					e.printStackTrace();
				}
			}
			catch(FileNotFoundException e) 
			{
				e.printStackTrace();
			}
			
			
			char tmp[] = new char[bytesReadForLinecount];
			try 
			{
				br.read(tmp, 0, bytesReadForLinecount-1);
			} 
			catch(IOException e1) 
			{
				e1.printStackTrace();
			}
			
			String tmp_2 = new String(tmp); 	
			if(tmp_2.contains("\r\n"))
			{
				System.out.println("Win");
				lineCount = (int)file.length() / 7;
			}
			else
			{
				System.out.println("Other OS");
				lineCount = (int)file.length() / 6;
			}
		
			setMinMax(0, lineCount); 
			
			vectorPrices =  new Vector<Float>(lineCount);
			try 
			{
				br.reset();
			} catch (IOException e1) 
			{
				e1.printStackTrace();
			}
			while(current < lineCount && !isInterrupted())
			{ 
			System.out.println("Zeile: " + current); 	// ERSTE AUSGABE !!!
				
				setValue(++current); 
				try 
				{
					vectorPrices.add(Float.parseFloat(br.readLine()));
					labelPrices.setText("Eingelesene Preise: " + current);
				}
				catch(NumberFormatException e)
				{
					e.printStackTrace();
				} 
				catch(IOException e) 
				{
					e.printStackTrace();
				}	
			}			
		}
		catch(OutOfMemoryError e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(br == null)try{br.close();}catch(IOException e){e.printStackTrace();}
		}
		status = null; 
	} 

	private void setMinMax(final int min, final int max) 
	{ 
		try{ 
			SwingUtilities.invokeAndWait(new Runnable()
			{ 
				public void run()
				{ 
					status.setMinimum(min); 
					status.setValue(min); 
					status.setMaximum(max); 
				} 
			}); 
		} 
		catch(Exception e)
		{ 
		} 
	} 

	private void setValue(final int value) 
	{ 
		System.out.println("Wert in 'setValue()': " + value);	// ZWEITE AUSGABE !!!
		
		SwingUtilities.invokeLater(new Runnable()
		{ 
			public void run()
			{ 
				try
				{ 
					System.out.println("Wert in 'invokeLater()': " + value);	// DRITTE AUSGABE !!!
					
					status.setValue(value); 
				} 
				catch(NullPointerException ex)
				{ 
				} 
			} 
		}); 
	}

Wenn ich das ganze jetzt mit einer Mio. Einträge laufen lasse, dann sieht die Ausgabe so aus [nur ein Auszug]:

  • Wert in 'setValue()': 1900
    Zeile: 1900
    Wert in 'setValue()': 1901
    Zeile: 1901
    Wert in 'setValue()': 1902
    Zeile: 1902
    Wert in 'setValue()': 1903
    Zeile: 1903
    Wert in 'setValue()': 1904
    Zeile: 1904
    Wert in 'setValue()': 1905
    Zeile: 1905
    Wert in 'setValue()': 1906
    Zeile: 1906
    Wert in 'setValue()': 1907
    Zeile: 1907
    Wert in 'setValue()': 1908
    Zeile: 1908
    Wert in 'setValue()': 1909
    Zeile: 1909
    Wert in 'setValue()': 1910
    Zeile: 1910
    Wert in 'setValue()': 1911
    Zeile: 1911
    Wert in 'setValue()': 1912
    Zeile: 1912
    Wert in 'setValue()': 1913
    Zeile: 1913
    Wert in 'setValue()': 1914
    Zeile: 1914
    Wert in 'setValue()': 1915
    Zeile: 1915
    Wert in 'setValue()': 1916
    Zeile: 1916
    Wert in 'setValue()': 1917
    Zeile: 1917
    Wert in 'setValue()': 1918
    Zeile: 1918
    Wert in 'setValue()': 1919
    Zeile: 1919
    Wert in 'setValue()': 1920
    Zeile: 1920
    Wert in 'setValue()': 1921
    Zeile: 1921
    Wert in 'setValue()': 1922
    Zeile: 1922
    Wert in 'setValue()': 1923
    Zeile: 1923
    Wert in 'setValue()': 1924
    Wert in 'invokeLater()': 1479
    Wert in 'invokeLater()': 1480
    Wert in 'invokeLater()': 1481
    Wert in 'invokeLater()': 1482
    Wert in 'invokeLater()': 1483
    Wert in 'invokeLater()': 1484
    Wert in 'invokeLater()': 1485
    Zeile: 1924
    Wert in 'setValue()': 1925
    Zeile: 1925
    Wert in 'setValue()': 1926
    Zeile: 1926
    Wert in 'setValue()': 1927
    Zeile: 1927
    Wert in 'setValue()': 1928
    Zeile: 1928
    Wert in 'setValue()': 1929
    Zeile: 1929
    Wert in 'setValue()': 1930
    Zeile: 1930
    Wert in 'setValue()': 1931
    Zeile: 1931
    Wert in 'setValue()': 1932
    Zeile: 1932
    Wert in 'setValue()': 1933
    Zeile: 1933
    Wert in 'setValue()': 1934
    Zeile: 1934
    Wert in 'setValue()': 1935
    Zeile: 1935
    Wert in 'setValue()': 1936
    Zeile: 1936
    Wert in 'setValue()': 1937

-> d.h. hin und wieder wird das invokeLater ausgeführt (d.h. heißt doch, dass dann gerade der EventDispatchingThread Rechnerkapazität hat um die GUI (sprich den Ladebalken) zu aktualisieren, oder?). Wie man sieht hängt der aber hinter dran (invokeWert: 1479; der Zeilenwert aber schon bei 1925!). Ich habe in meinen Programm kein Sleep eingebaut, um somit Kapazität für das invokeLater zur Verfügung zustellen. Könnte es daran liegen? Das Problem ist halt auch: wenn ich eines einbauen täte, würde der eh schon recht lang dauernde Einleseprozess noch deutlich verlängert!

Kann es sein, dass wenn das Einlesen fertig ist, die invokeLater-Funktion nicht mehr ausgeführt wird, dass heißt der Ladebalken nicht mehr vollends gefüllt wird? Oder woran liegt es, dass der Balken bei wenigen Zeilen in der einzulesenden Datei nicht richtig gefüllt wird?

Dem würde aber die folgende Ausgabe bei einer Datei mit 35 Zeilen (es werden aber nur 34 Zeilen eingelesen, aber des ist ein anderes Problem -> anderer Thread) entgegensprechen:

  • Zeile: 0
    Wert in 'setValue()': 1
    Wert in 'invokeLater()': 1
    Zeile: 1
    Wert in 'setValue()': 2
    Zeile: 2
    Wert in 'setValue()': 3
    Zeile: 3
    Wert in 'setValue()': 4
    Zeile: 4
    Wert in 'setValue()': 5
    Zeile: 5
    Wert in 'setValue()': 6
    Zeile: 6
    Wert in 'setValue()': 7
    Zeile: 7
    Wert in 'setValue()': 8
    Zeile: 8
    Wert in 'setValue()': 9
    Zeile: 9
    Wert in 'setValue()': 10
    Zeile: 10
    Wert in 'setValue()': 11
    Zeile: 11
    Wert in 'setValue()': 12
    Zeile: 12
    Wert in 'setValue()': 13
    Zeile: 13
    Wert in 'setValue()': 14
    Zeile: 14
    Wert in 'setValue()': 15
    Zeile: 15
    Wert in 'setValue()': 16
    Zeile: 16
    Wert in 'setValue()': 17
    Zeile: 17
    Wert in 'setValue()': 18
    Zeile: 18
    Wert in 'setValue()': 19
    Zeile: 19
    Wert in 'setValue()': 20
    Zeile: 20
    Wert in 'setValue()': 21
    Zeile: 21
    Wert in 'setValue()': 22
    Zeile: 22
    Wert in 'setValue()': 23
    Zeile: 23
    Wert in 'setValue()': 24
    Zeile: 24
    Wert in 'setValue()': 25
    Zeile: 25
    Wert in 'setValue()': 26
    Zeile: 26
    Wert in 'setValue()': 27
    Zeile: 27
    Wert in 'setValue()': 28
    Zeile: 28
    Wert in 'setValue()': 29
    Zeile: 29
    Wert in 'setValue()': 30
    Zeile: 30
    Wert in 'setValue()': 31
    Zeile: 31
    Wert in 'setValue()': 32
    Zeile: 32
    Wert in 'setValue()': 33
    Zeile: 33
    Wert in 'setValue()': 34
    Wert in 'invokeLater()': 2
    Wert in 'invokeLater()': 3
    Wert in 'invokeLater()': 4
    Wert in 'invokeLater()': 5
    Wert in 'invokeLater()': 6
    Wert in 'invokeLater()': 7
    Wert in 'invokeLater()': 8
    Wert in 'invokeLater()': 9
    Wert in 'invokeLater()': 10
    Wert in 'invokeLater()': 11
    Wert in 'invokeLater()': 12
    Wert in 'invokeLater()': 13
    Wert in 'invokeLater()': 14
    Wert in 'invokeLater()': 15
    Wert in 'invokeLater()': 16
    Wert in 'invokeLater()': 17
    Wert in 'invokeLater()': 18
    Wert in 'invokeLater()': 19
    Wert in 'invokeLater()': 20
    Wert in 'invokeLater()': 21
    Wert in 'invokeLater()': 22
    Wert in 'invokeLater()': 23
    Wert in 'invokeLater()': 24
    Wert in 'invokeLater()': 25
    Wert in 'invokeLater()': 26
    Wert in 'invokeLater()': 27
    Wert in 'invokeLater()': 28
    Wert in 'invokeLater()': 29
    Wert in 'invokeLater()': 30
    Wert in 'invokeLater()': 31
    Wert in 'invokeLater()': 32
    Wert in 'invokeLater()': 33
    Wert in 'invokeLater()': 34

So wie ich das interpretiere, wird doch erst alles eingelesen und dann müsste doch im Nachhinein (was eigentlich nicht so gewollt ist, aber besser als einen leeren Balken) der Balken noch bis auf 100% gefüllt werde, da ja für alle Zeilen die invokeFunktion aufgerufen wurde.

Hoffe auf Hilfe. Habe das mit den Threads noch nicht 100% durchsteigen.

Habe deshalb auch noch eine zweite Frage:

In der Funktion setValue ist ein invokeAndWait drinnen. Ist dies sinnvol? Bin mir da net sicher.

Grüße - spacegaier
 

André Uhres

Top Contributor
spacegaier hat gesagt.:
..In der Funktion setValue ist ein invokeAndWait drinnen. Ist dies sinnvol?..
Du meinst sicher invokeLater.
Im vorliegenden Fall würde ich es weglassen. Bei labelPrices.setText machst du's ja auch nicht :wink:
 

NTB

Bekanntes Mitglied
Du könntest in Deinen Einlesethread mal ein Thread.yield() einbauen. Aber das würde ich nur testweise machen, denn es geht ja in erster Linie ums einlesen.
 

spacegaier

Mitglied
Ich meinte mit der zweiten Frage, das invokeAndWait in der Funkiot setMinMax().

Meinst du mit weglassen, ich soll die ganze Thread-Geschichte weglassen? Aber dann würde doch der Ladebalken erst nach dem Einlesen erscheinen, oder?

Wie verhällt es sich jetzt mit der Funktion invokeLater von wegen nicht mehr ausführen nach dem Einlesen?

Soweit ich das sehe, läuft das doch so ab:

Mein Programm fängt an Daten einzulesen und sobald (warum auch immer) etwas Rechnerkapazität über ist wird die run()-Funktion von invokeLater ausgeführt, welche den ProgressBar weiterlaufen lässt (richtig soweit?). Müsste ich dann nicht eigentlich das Einlesen zwischenzeitlich lahmlegen (mittels Sleep) um Rechnerkapazität zum Ladebalken updaten zur Verfügung zu stellen? Das mache ich ja momentan nicht und trotzdem wird der Balken gezeichnet (aber nur bei langen Einleseprozessen). Warum (so soll es ja sein, aber ich verstehe das net)?

Und was ist an Einleseprozess auszusetzen? ???:L
 

André Uhres

Top Contributor
spacegaier hat gesagt.:
..Und was ist an Einleseprozess auszusetzen? ???:L
Gar nichts. Aber der Dativ ist dem Genitiv sein Tod :shock:

Ich will ja nichts sagen, was nicht ist, aber wenn ich invokeLater hier rausnehme:
Code:
       private void setValue(final int value) {
            System.out.println("Wert in 'setValue()': " + value);   // ZWEITE AUSGABE !!!
            try {
                status.setValue(value);
            } catch(NullPointerException ex) {
            }
        }
dann funktioniert es tadellos bei mir :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Problem SwingUtilities.invokeLater Allgemeine Java-Themen 2
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Y MVVM wie wird Eventhandler tausch geregelt Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
N warum wird es doppelt ausgegeben Allgemeine Java-Themen 6
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Y Warum wird das JLabel falsch verschoben? Allgemeine Java-Themen 1
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
N Eingabe wird immer als "false" ausgegeben Allgemeine Java-Themen 6
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
hello_autumn Java_Home geändert auf Java 13, trotzdem wird Java Version 8 angezeigt. Allgemeine Java-Themen 2
Thallius Char +1 wird int? Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
F Scrollbar wird nicht angezeigt Allgemeine Java-Themen 0
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
S If-Menü wird doppelt ausgegben Allgemeine Java-Themen 4
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
S Wird bei den JREs 9, 10, 11+ ueberhaupt noch Bytecode ausgefuehrt..? Allgemeine Java-Themen 8
FRI3ND JFrame wird nicht angezeigt Allgemeine Java-Themen 3
T Plötzlich wird package nicht mehr gefunden Allgemeine Java-Themen 3
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
kodela Klassen Klassenvariable wird nicht gesetzt Allgemeine Java-Themen 23
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
kodela Drücken der ALT-Taste wird nur bei jedem zweiten Mal erkannt Allgemeine Java-Themen 5
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
D Cursor unsichtbar, wenn Kontextmenü aufgerufen wird Allgemeine Java-Themen 5
K Arbeitsspeicher wird langsam voll Allgemeine Java-Themen 6
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
N Datentypen If-Statement wird "übersprungen" Allgemeine Java-Themen 2
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Java wird nicht gefunden Allgemeine Java-Themen 32
Tacofan GIF-Bild wird "zerstört" Allgemeine Java-Themen 3
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
Sin137 Interface Eingabe wird doppelt angezeigt Allgemeine Java-Themen 2
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
E Java wird beendet nach paar Sekunden Allgemeine Java-Themen 14
U Erkennen, ob PC benutzt wird Allgemeine Java-Themen 4
O Programm wird einfach "gekillt" Allgemeine Java-Themen 3
P Prüfen ob es Variable mit Namen gibt der als String übergeben wird Allgemeine Java-Themen 7
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
B Abfragenteil wird nicht aufgerufen Allgemeine Java-Themen 2
Todesbote JFileChooser im Vordergrund (*.jar wird mittels shell_exec in PHP aufgerufen) Allgemeine Java-Themen 1
T Sicherheitshinweis - Zertifikat wird angefordert Allgemeine Java-Themen 5
L SetBounds wird vor dem Konstruktorcode aufgerufen - Wenn Startleiste links Allgemeine Java-Themen 1
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
I CountDown wird durch JOptionPane unterbrochen Allgemeine Java-Themen 11
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
G Tabelle wird nicht richtig dargestellt Allgemeine Java-Themen 9
HarleyDavidson Threads ProgressMonitor wird nicht angezeigt! Allgemeine Java-Themen 6
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
A Long variable wird negativ??? Allgemeine Java-Themen 1
J CSV Datei wird ungewollt umformatiert Allgemeine Java-Themen 5
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
gamebreiti Swing JLabel wird nicht angezeigt Allgemeine Java-Themen 4
I Java Applet wird immer blockiert Allgemeine Java-Themen 3
E Java Editor Klasse wird nicht weiter ausgeführt Allgemeine Java-Themen 4
S Java Applet wird dauerhaft blockiert Allgemeine Java-Themen 1
I Datei wird nicht richtig gelöscht Allgemeine Java-Themen 7
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
D Input/Output Datei wird lokal aber nicht vom Webserver ausgelesen... Allgemeine Java-Themen 2
F Nach Export wird PDF Datei nicht mehr gefunden Allgemeine Java-Themen 0
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
I Projekt wird nicht erstellt Allgemeine Java-Themen 2
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
A Threads Log4J Logger wird "überschrieben" Allgemeine Java-Themen 3
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
J batch datei wird nicht aufgerufen Allgemeine Java-Themen 11
M Datei wird nicht vollständig geschrieben (FileOutputStream, OutputStreamWriter, Encoding) Allgemeine Java-Themen 6
P OSGi - Bundle-Methode wird nicht aufgerufen Allgemeine Java-Themen 3
S Antlr Grammatik übersetzt ohne Fehler, dennoch wird Zahl nicht als Eingabe erkannt Allgemeine Java-Themen 4
T Variablen Variable wird als nicht genutzt angezeigt Allgemeine Java-Themen 8
J Slideshow wird im IE überblendet Allgemeine Java-Themen 4
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
J Textdatei auslesen, die gerade benutzt wird Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben