JProgressBar + Thread + Client

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
HI!!

Ich würde euch kurz mal um Hilfe bitten:
Ich habe Einen Server / Client geschreiben mit dessen Hilfe man files versenden kann. Zustäzlich wollte ich eine JProgressBar einfügen (= im Hauptfenster), was auch funktioniert:
Code:
private JProgressBar m_prBar;
// ... funktionen uws
// Einbau der JProgressBar ins JFrame
m_prBar = new JProgressBar(0,100); 
m_prBar.setStringPainted(true);
jpanel2.add(m_prBar);

// Fenster wir zusamengebaut.

Im weiteren Programm Teil rufe ich den Cleint auf der die Daten an den server schickt ( dabei übergebe ich die JProgressbar mit)

Code:
// m_ip ... = die Ziel ip
// FTO.getfreadpfad() = quelladresse der datei
// m_prBar = JProgress Bar
RClient client= new RClient(m_ip, FTO.getfreadpfad(), m_port.getText(), m_prBar);
client.runClient();

Im Client verwende ich einen Thread mit dessen hilfe ich die verschieckte datenmenge berechne
und hier möchte ich dei Progressbar aktualisieren
Code:
// Thread kreieren
new Thread()
            {   
                public void run()
                {  long lcurrent= 0;
                    int i = 0;
                    while(calc_bar)
                    {   File f = new File(m_pfad);
                        long lmax = f.length();
                        // Berechnung  und den Procentualen wert in JProgressBar einfügen                      
                        m_prBar.setValue(wert);
                        m_prBar.validate();
                        m_prBar.repaint();
                     
                    }
                }
              }.start();
//Thread beendet  
// Socket und Datentransfer      
            clientSocket = new Socket(InetAddress.getByName(m_ip), m_port);
            OutputStream out = clientSocket.getOutputStream();
            InputStream in = new FileInputStream(m_pfad);
            byte[] buffer = new byte[1024];
            int n;

             while ((n = in.read(buffer)) != -1)
            {
                out.write(buffer, 0, n);
             
            }
            in.close();
            out.close();   
            calc_bar=false;
        }
Das Problem ist er führt den Thread korrekt aus jedoch wird die JProgressBar im Hauptprogramm erst nach beenden der Datenübertragung aktualisiert.
Wieso? wenn ich sie hier repainte? Wie kann man das Problem lösen thx für eure hilfe
 

MPW

Top Contributor
Ein Problem von Swing ist nicht Threadsicher, du musst das mit einer EventQueue.invokeAndWait machen.
 
G

Gast

Gast
Das funktioniert schön und gut solange man keinen Server in die Ver scheibung der ProgressBar einbaut also:

solange in der Klasse Algorithmus nur:
Code:
while( current <= end && !isInterrupted() ){ 
         try{ 
            Thread.sleep( 100 ); // Kurz warten 
         } 
         catch( InterruptedException e ){ 
         } 
         setValue( current++ ); // Hey! Es ist was passiert! 
      }
wenn da jedoch einen Server einbaut(funktioniert es nicht ) also wenn zB:
Code:
try
{
InputStream in = verbindungsSocket.getInputStream();
OutputStream out = new FileOutputStream(pfad);     
byte [] buffer = new byte [1024];
int n;

int fsize = in.read();

while ((n = in.read(buffer)) != -1 )
{ if(current <= end && !isInterrupted())
                    {
                    
                        try{ 
                            Thread.sleep( 100 ); // Kurz warten 
                        } 
                        catch( InterruptedException e ){ 
                       }
                        current ++;
                    }
                     this.setValue( current); // Hey! Es ist was passiert! 
                    out.write(buffer,0,n);
                  } 
 }
und hier die dazugeöhrigen catch funktioniert es nicht mehr
woran kann das liegen
 

MPW

Top Contributor
Also irgendwie hast du das ein bisschen komisch gemacht,
die schleife kann noch weiterlaufen, aber der Inhalt muss nicht umbedingt noch ausgeführt werden; für meinen Geschmack ist das schlechter Stiehl.

Was genau ist end, die länge von buffer, oder wie?

Es kann passieren, dass der Thread interrupted wird, aber die Schleife läuft dann noch weiter, das macht keinen Sinn.

Hängt doch mal die Bedinngungen aus dem if mit && noch in den while-kopf, oder ist das Absicht, das trotzdem noch alles eingelesen wird?

Noch was:
Deine Klasse erbt von JProgressBar?
Code:
this.setValue(current);
//eigentlich reicht doch dann:
setValue(current);


Setz mal da irgendwo ein System.out.println() rein, ich hab' das Gefühl, das das Problem nicht die Progressbar selbst ist, da läuft glaube ich noch was anderes schief.

[edit:] Es kann aber rein theoretisch auch sein, dass die JVM das einlesen für wichtiger hält, und deswegen die ProgressBar nicht aktualisiert wird! In dem Falle müsstest du doch mit der EventQueue arbeiten. [/edit]
 
G

Gast

Gast
Schau es ist so: (ich habe es so gemacht wie das muster bei diesem Link http://www.java-forum.org/de/viewtopic.php?t=8101)
Ich habe eine Klasse Server welche von Runnable erbt diese Startet dann die Klasse algorithmus welche unter dem oben angefürten link steht. Dort füge ich dann den wirklichen Server quellkod ein d.h. ich starte den Server mit dem oben angeführten Code. Das mit der Schleife ist vorerst absichtlich so gemacht denn wenn ich den && Befehl in den Schleifenkopf gebe wird das File nie 100% übertragen und eine Exception wird geworfen. Das Problem ist aber Folgenden: Ich habe einen System.out.println("ZEICHNE MICH"); befehl reingegeben und das Problem ist: der wird ausgegeben woraus folg das die Schleife und der Rest passt. wenn du Debuggst wird es auch korrekt ausgeführt und setValue(current) wird ebenfalls aufgefruffen und ausgeführt nur die GUI zeichnet es nicht. Es kann daran Liegen wie du sagtest das der eingentliche Servercode wichtiger ist als die GUI. Ich habe keine Ahnung wieso das nicht funkt.
 

MPW

Top Contributor
Das funzt nicht, weil Swing nicht Threadsicher ist, wie bereits ich und einige andere hier in diesem Thread gesagt haben.

Versuch's mal mit java.awt.EventQueue.invokeAneWait() wie im Tutorial beschrieben ist!

[edit:] Aber die Progressbar, selbst wenn sie dann mal richtig gezeichnet wird, wird mit deiner Schleifenkonstruktion sowieso nie richtig funktionieren, aber das ist ein Problem, was ich erst im zweiten Schritt lösen würde.
 
G

Gast

Gast
Sie wird korrekt angezeigt nur nicht aktualisiert EventQueue.invokeAndWait() verwende ich bereits wenn ich die aktualsierung parallell zum empfang der daten machen will also in dieser Schliefe
while ((n = in.read(buffer)) != -1 )
{
//Aktualisieren
}
wird sie nicht aktualisiert funktionen ausgeführt Balken nicht gezeichnet wenn ich zuerst daten schicke obere Schleife
und dann den Balken Aktualisierte (andere schleife mit thread also 1 sek warten zeichnen dann funkt es entweder ich bin zu dumm um das richtig einzubauen oder es ist wirklich so das der Server die höhere Priorität hat
 

MPW

Top Contributor
Sorry, kannst du die letzten drei Zeilen nochmal neu formulieren, ich steig' da nicht durch.
 
G

Gast

Gast
Also ich habe das Problem gelöst.
Ich wollte das die JProgessBar / ProgressMonitor automatisch die größe der empfangenen / gesendeten Datei anzeigt.
Bis jetzt funtkioniert bei mir nur der Folgende Lösungsweg wirklich:
1) Server als Thread (logisch)
2) Client als Thread(auch logisch)
3) Sobald der Client / Server läuft muss man von dort aus mit Hilfe einer set Funktion, die man selber schreibt auf eine andere Klasse zugreifen. Diese Andere Klasse sollte die JProgessBar oder halt den ProgessMonitor beinhalten. Falls man keine externe setfunktion einer anderen Klasse aufruft sonder einfach in dem Client / Server Thread den Wert setzen läst so wird das nicht druchgeführt. Dabei hilft auch EventQueue.invokeAndWait() nicht weiter, AUSER: die JProgessBar / ProgessMonitor wird in einem weiteren eigenen Thread gestartet. EventQueue.invokeAndWait() kann man verwenden wenn in dem Client / Server Thread die JProgessBar oder der ProgessMonitor ein einem eigenen Thread gesetzt wird ansonsten, also wenn ohne eigenen Thread (empfangen & setzen) funktioniert es nicht. Wahrscheinlich gibt es auch eine einfachere Lösung.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Repaint bei JProgressBar AWT, Swing, JavaFX & SWT 3
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
H JProgressBar in TableColumn von JTable setzen/abfragen AWT, Swing, JavaFX & SWT 5
B JProgressBar: wie muss ich das lösen? AWT, Swing, JavaFX & SWT 4
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
G JProgressbar AWT, Swing, JavaFX & SWT 8
A JProgressBar: Farbe im Windows Look&Feel ändern. AWT, Swing, JavaFX & SWT 1
C JProgressBar und ihre Tücken AWT, Swing, JavaFX & SWT 8
G JProgressBar in JTable AWT, Swing, JavaFX & SWT 6
G Probleme mit JProgressbar auf JPanel in JFrame AWT, Swing, JavaFX & SWT 6
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
T JProgressBar und CMP Bean AWT, Swing, JavaFX & SWT 2
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
L JProgressbar möglichst genau AWT, Swing, JavaFX & SWT 3
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G JProgressBar AWT, Swing, JavaFX & SWT 8
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
U JProgressBar in umgekehrter Richtung AWT, Swing, JavaFX & SWT 2
S JProgressBar einbinden AWT, Swing, JavaFX & SWT 5
H JProgressBar AWT, Swing, JavaFX & SWT 6
T JProgressBar und JPG AWT, Swing, JavaFX & SWT 2
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben