Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Allgemeine Java-Programmierung > Lange Methode blockiert UI
Antwort
 
Themen-Optionen
Alt 07.03.2006, 09:28   Nach oben    #1
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard Lange Methode blockiert UI

Hallöchen nochmal...

ich habe eine UI, in der man u. a. eine Datei per JFileChooser auswählt. Wenn der Benutzer das macht, soll die ausgewählte Datei durchlaufen werden, um schonmal bestimmte Informationen anzuzeigen. Im Prinzip passiert hier nicht viel mehr als das Zählen der Zeilen dieser Textdatei.
Was mich nur stört ist, dass diese Zählmethode die UI blockiert und diese erst wieder "freigibt", wenn zuende gezählt wurde (das Zählen könnte bis zu 10 Sek. dauern - große Dateien ^^). Ich hätte es aber nun gerne, dass diese Methode die UI nicht blockiert, so dass der Benutzer weitere Einstellungen auf der UI vornehmen kann, während im Hintergrund diese Datei durchgezählt wird.

Erstmal ein paar wichtige Infos:

FileSelector - kombiniert ein JTextField mit einem Browse-Button, der den JFileChooser aufruft. Besitzt ebenfalls ein optionales JLabel, um auf diesem irgendwelche Infos darzustellen. Dieses JLabel möchte ich dazu verwenden, dass der Benutzer mitbekommt, dass die selektierte Datei a) noch gezählt wird oder b) xyz Zeilen enthält. Das JLabel ist per Methode public JLabel getDescriptionLabel() zugreifbar.

GeneCountThread - Zählt die Zeilen der Datei, die Genexpressionsprofile definieren. Hab mir schon gedacht, dass man das in einen eigenen Thread packen muss, damit es nebenher läuft, aber ich bin Thread-Noob ^^ und irgendwas mach ich hier falsch. Code-Auszug:
Code:
public class GeneCountThread implements Runnable {
  //...
   public GeneCountThread(File f, JLabel display) { //Die Datei und das JLabel des FileSelectors
     //...
   }
 
   public void run() {
     genes = 0;
     try {
       StanfordReader sp = new StanfordReader(f);
       Gene g = sp.readGene();
       while(g!=null) {
         genes++;
         //das JLabel 'display' soll nicht für jedes einzeln gezählte Gen aktualisiert werden
         if(genes%10==0) this.display.setText(genes+" genes. Still counting...");
          //ein Thread.sleep() scheint hier auch nicht viel zu bringen
         g = sp.readGene();
       }
       sp.close();
       // während des Zählens hat das JLabel rote Schrift.
       // Wenn fertig gezählt wurde, soll Schrift schwarz sein
       this.display.setForeground(Color.BLACK);
       this.display.setText("File contains "+genes+" genes");
     }
     catch(Exception e) {
           // ...
     }
   }
 }
Das müsste eigentlich ausreichen... Was muss ich denn tun, damit der Benutzer während dieser run()-Methode weiter auf dem UI rumklicken kann?
Hoffe es gibt da was, was mir meine Architektur nicht über den Haufen wirft ^^

Thx in advance
sayang
Sayang ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 10:05   Nach oben    #2
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

die endscheidenden zeilen code hast du nicht gepostet, aber ich vermute das du die run methode von GeneCountThread direkt aufrufst.
Code:
GeneCountThread t = new GeneCountThread();
t.run();
das ist natürlich nicht sinn der sache.
Klassen die Runnable implementieren sind noch keine threads, sie können von threads aufgerufen werden.
entwerder du änders die klasse GeneCountThread um, das sie Thread erweitert,
oder du änderst den aufrufenden code, dann solltest du GeneCountThread in GeneCountRunnable umbenennen.
Code:
Runnable run = new GeneCountThread();
Thread thread = new Thread(run);
thread.start();
und die run methode wird nebenläufig aufgerufen...
beny_mcde ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 10:35   Nach oben    #3
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

Perfekt... manchmal sind die einfachsten Fehler doch diejenigen, auf die man einfach nicht kommt ^^

dankeschön...
sayang

PS: kann man hier die Themen eigentlich auch als erledigt markieren? ich hab sone option jedenfalls noch nicht gefunden... vll. bin ich hier ja auch so blind wie bei meinem problem ^^
Sayang ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 10:42   Nach oben    #4
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von Sayang
PS: kann man hier die Themen eigentlich auch als erledigt markieren? ich hab sone option jedenfalls noch nicht gefunden... vll. bin ich hier ja auch so blind wie bei meinem problem ^^
Yeah. Find ich auch äußerst nützlich. Steht auf der ToDo-Liste, da es leider nicht von Haus aus möglich ist.

Aber gut, dass Du es angemerkt hast, dann muss ich mich da langsam mal mit beschäftigen .
Diskussion dazu kann bei Bedarf und Interesse hier fortgeführt werden.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 10:45   Nach oben    #5
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Sei froh, dass es das nicht gibt...
Dein Problem fängt nämlich gerade erst an.

Du darfst nicht aus einem anderen Thread auf Swing-Komponenten zugreifen.

d.h. aus:
Code:
if(genes%10==0) this.display.setText(genes+" genes. Still counting...");
Wird sowas:
Code:
if(genes%10==0) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            this.display.setText(genes+" genes. Still counting...");
        }
    });
}
Das gleiche gilt auch für die andere Zugriffe auf Swing-Komponenten...


Als kleinen Tipp möchte ich zwei Namen in den Raum werfen, die du ergooglen könntest: Foxtrot und SwingWorker.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 14:06   Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von Xean
 
Registriert seit: 17.08.2005
Beiträge: 425
Standard

Warum darf man das nicht??? ist es nur nicht schön geschrieben, oder bekommt man dann probleme???
Xean ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 14:09   Nach oben    #7
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

[GEFÄHRLICHES HALBWISSEN]
Afaik ist es doch so, dass Swing mit einem eigenen Thread arbeitet und das es aus diesem Grunde dann zu Komplikationen kommen kann.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 14:20   Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

Zitat:
Zitat von Xean
Warum darf man das nicht??? ist es nur nicht schön geschrieben, oder bekommt man dann probleme???
Swing ist nicht Thread Sicher. => Kommt dann zu Darstellungsfehlern u. ä. . Deswegen immer wenn Swing in Verbindung mit einem anderen Thread kommt invokeLater verwenden.

Was die Begründung angeht dürfte Ben gar nicht ma so falsch liegen
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 14:42   Nach oben    #10
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

Ähh ja... danke für den Hinweis. War ja klar, dass sowas kommt ^^
Versuche mich dann mal da durchzuwurschteln.

Lg
sayang
Sayang ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 14:51   Nach oben    #11
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Hab ich aber auch erst rausgesucht, als ich mit meinem Halbwissen wenigstens so teilweise bestätigt wurde .
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2006, 22:43   Nach oben    #12
Erfahrener Benutzer
 
Benutzerbild von Xean
 
Registriert seit: 17.08.2005
Beiträge: 425
Standard

ok, werd es dann mal beachten.... hatte bis jetzt noch keine probleme, hab auch nicht so oft irgend ein prog geschrieben, was in diese richtung geht...
Xean ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Statische unbekannte Methode aufrufen bobby PHP-Programmierung 6 17.03.2007 17:58
PHPeclipse - herausfinden, wo eine Methode aufgerufen wird Ben Eclipse 3 12.03.2006 22:46
statische Methode per Reflection aufrufen ehli75 Allgemeine Java-Programmierung 2 02.02.2006 13:17
Methode in der main aufrufen, unterschied JApplet und JFrame Gottzilla Desktop-Applikationen und Grafik 3 10.03.2005 10:12
Clone Methode treibt mich zum Wahnsinn pro_evo Allgemeine Java-Programmierung 7 23.01.2005 08:34


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:36 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44