# Nochmal Threads und Einfrieren des GUI :(



## Guest (9. Feb 2004)

Hi

ich weiss das es schon viele Posts dazu gibt und ich hab sie mir alle durchgelesen aber mein Problem konnte ich noch nicht lösen!

Ich hab ein Hauptfenster indem ich per knopfdruck das event auslöse was mir Probleme bereitet.

Code des Events des Hauptfensters:


```
// Aufruf des zweiten Fensters
        jProgress jp = new JTrace.jProgress(); 
        jp.main(1000);

        // Aktionen

            try 
            { 
                Thread.sleep(10000); 
            } catch (InterruptedException e) {}

        // Aktionen & Ende
```

Die Pause in dem Event is wichtig da ich in der zeit ein anderes tool aufrufe was erst fertig mit seiner arbeiten sein muss!


Code des zweiten Fensters das dazu da is das einen Progressbat darzustellen:


```
public class jProgress extends Thread {
    
    final JFrame frame = new JFrame(); 
    final JProgressBar bar = new JProgressBar();
    final JButton butOk = new JButton("OK");
    private int time = 0;
    
    public void main(int tmpTime) {
        
        time = tmpTime;
        Thread th = new Thread(this); 
        th.start();
        
    }
    
    public void run() 
    { 
        butOk.addActionListener(new java.awt.event.ActionListener() 
        {
            public void actionPerformed(java.awt.event.ActionEvent evt) 
            {
                System.out.println("OK gedrückt!");    
            }    
        });    
        
        frame.setTitle("Progress:");
        Container pane = frame.getContentPane(); 
        pane.setLayout(new FlowLayout()); 
        pane.add(bar);
        pane.add(butOk);
        bar.setMinimum(0); 
        bar.setMaximum(100); 
        bar.setStringPainted(true);
        frame.setResizable(false);
        frame.setVisible( true );

        int i = 0; 
        while(i <= 100) 
        {                                       
            bar.setString("Working...");
            try 
            { 
                Thread.sleep(time); 
            } catch (InterruptedException e) {} 
            
            bar.setValue(i); 
            i++;
        } 
        bar.setString("Complete!"); 
    }
}
```

Während der 10sec Wartezeit im Hauptfenster aktualisiert sich das zweite fenster nicht! Erst wenn das Event durchgelaufen ist!

thx

Chris


----------



## Guest (9. Feb 2004)

anders gesagt das GUI verhält sich genauso als würde es in einem Thread laufen!

(tuts wahrscheinlich auch aber ka warum)


----------



## Beni (9. Feb 2004)

Chris hat gesagt.:
			
		

> Die Pause in dem Event is wichtig da ich in der zeit ein anderes tool aufrufe was erst fertig mit seiner arbeiten sein muss!



Aber genau diese Pause verursacht das Problem. Hier wird das gesammte Swing blockiert.

Wäre es nicht möglich bei dem jProgress anstelle eines Frames einen modalen JDialog zu verwenden?


```
JFrame mainApplication = ...
JDialog dialog = new JDialog( mainApplication, "Progress", true );
```

Der blockiert dann nur die Eingaben.

mfg Beni


----------



## Guest (9. Feb 2004)

leider geht das nich

es ist wichtig das ich die pasue im quellcode des events habe! Nich das der user keine weiteren angaben machen kann sondern das wirklich gewartet wird!


----------



## Guest (9. Feb 2004)

falls ich jetzt anstatt der pause mit "Thread.sleep..." eine sehr komplexe Berechnung, die 10 sec dauert, hätte wäre das ergebnis doch das gleiche oder?

Das GUI würde sich 10 sek nicht aktualisieren und das kann doch nich sein. Dann find ich java sche.. wenn das nich möglich ist


----------



## Beni (9. Feb 2004)

Ausschnitt aus der API des JDialogs:



> public void show()
> 
> Makes the Dialog visible. If the dialog and/or its owner are not yet displayable, both are made displayable. The dialog will be validated prior to being made visible. If the dialog is already visible, this will bring the dialog to the front.
> 
> *If the dialog is modal and is not already visible, this call will not return until the dialog is hidden by calling hide or dispose*. It is permissible to show modal dialogs from the event dispatching thread because the toolkit will ensure that another event pump runs while the one which invoked this method is blocked.



Kommt das an das heran, was du benötigst?

mfg Beni


----------



## Guest (10. Feb 2004)

ich hab den Code auf JDialog umgebaut aber leider hab ich jetzt noch ein anderes komisches Verhalten!

Das Programm läuft bis zur Show()-Methode und nicht weiter! Erst wenn ich das Fenster Schließe!


```
dialog.show();
        
        int i = 0; 
        while(i <= 100) 
        {                                       
            bar.setString("Working...");
            try 
            { 
                this.sleep(time); 
            } catch (InterruptedException e) {} 
            System.out.println("Zeile: " + i);
            bar.setValue(i); 
            i++;
        }
```

Show() wartet whrscheinlich auf user eingabe oder?


----------



## Guest (10. Feb 2004)

vll sollte ich mochmal beschreiben was ich als resultat haben möchte.

Ich drücke auf einen Knopf.
    Ein Dialog erscheint und es läuft ein Progressbar los! (20 sec)
    Beim Event des Konpfes wird etwas gemacht
        dann 10 sec gewartet
        dann wieder etwas gemacht

Die ganze Zeit soll der Progressbar weiterlaufen.


----------



## DreamArtist (10. Feb 2004)

Mach eine Monitorklasse die beide Klassen steuert.

z.B.:
Klasse Monitor ist die Steuerung

Klasse Eingabe extends Thread   ist die Klasse die auf die Eingabe wartet

Klasse JProgress extends Thread    ist die Klasse die eben das ausführt was in der Pause von der Eingabe sein soll

Funktionsweise:

Klasse Monitor erstellt eine Instanze von Eingabe und JProgress
Eingabe bekommt eine Referenz vom Monitor.
JProgress bekommt eine Referenz vom Monitor.

wird jetzt eine Eingabe gemacht benachrichtigt die EingabeKlasse den Monitor.
der sleept die Eingabe ein und startet den JProgress.

würde aber noch einen Flag setzen wenn der JProgress fertig ist.
damit bei langsamen Rechnern sich nicht eine Verzögerung ergibt, bzw bei schnellen Rechner der Benutzer nicht solange warten muß.


----------



## Guest (10. Feb 2004)

danke für deine Hilfe!

Das hört sich an wie die Lösung des Problems aber leider auch sehr kompliziert 

Meine Klasse die auf Eingabe wartet ist das Hauptfenster wo ich den Button drücke oder?
Diese Klasse ist extends javax.swing.JFrame! Kann ich das ohne Probleme in Thread umändern? 
Ich benutzte einen Form-Editor zum erstellen.

Gibt es irgendwo beispiele eines Codes mit dieser Implementierung?

cu

Chris


----------



## AlArenal (10. Feb 2004)

http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html


----------

