WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 09.06.2008, 14:44   #1
athropos
Hero
 
Registriert seit: 24.07.2001
Alter: 46
Beiträge: 801


athropos eine Nachricht über Skype™ schicken
Beitrag Java Threads - howto?

Hi!

Ich hab bei einem Projekt mehrere GUI-Funktionalitäten auf mehrere Klassen aufgeteilt.
So weit, so gut, es funktioniert auch alles wies soll, allerdings sind die GUIs teilweise voneinander abhängig und ich würde das Ganze gerne in Threads packen.

Sollte insoferne einfach sein, als das von einer Gui die anderen aufgerufen werden (und zwar seriell) und immer nur eine Gui gleichzeitig aktiv ist/sein sollte.

Nur bin ich bislang nicht ganz dahinter gestiegen, wie genau ich das mit den Threads anlegen kann. Eigentlich sollte es ja möglich sein, daß ich eine Gui warten lasse, bis eine andere beendet ist, dann die notwendigen Daten hole/rüberspiele (get/set) und dann die 1. Gui wieder aktiv ist.
Nur, wie implementier ich das am Gescheitesten?

Any Tips, Links etc?

thx & lg,
Athropos
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π.
Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre.

Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\"

Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\".
athropos ist offline   Mit Zitat antworten
Alt 10.06.2008, 08:48   #2
Farkarich
Senior Member
 
Registriert seit: 19.09.2000
Alter: 40
Beiträge: 122


Farkarich eine Nachricht über ICQ schicken
Standard

Hi!

Mit was hast du die GUI erstellt?? SWING??

Ich kann dir mal vorweg sagen dass gui und mehrere Threads schon zeitweise extrem blöd zu lösen ist.

Wenn du wirklich willst dass die anderen Frames "warten" sprich "einfrieren" wenn du was ausführst dann brauchst eigentlich keine Threads weil der vorteil von Threads ist ja dass du mehrere sachen gleichzeitig ausführen kannst.

Solltest du Threads brauchen musst du jeden Thread der nebenbei passierensoll in der gui mit SwingUtil.invokeLater(myThreadFred) (hoffe dass heißt so) ausführen...

hoffe habe dir ein bischen geholfen...
Farkarich ist offline   Mit Zitat antworten
Alt 10.06.2008, 12:31   #3
athropos
Hero
 
Registriert seit: 24.07.2001
Alter: 46
Beiträge: 801


athropos eine Nachricht über Skype™ schicken
Standard

Hi!
Ja, eine swinggui.

Wenn ich also keine Threads brauche, wie löse ich das Problem mit dem warten dann?
Konkretes Bsp: es gibt eine Terminübersicht; neue Termine lege ich mit einer anderen Klasse an (die allerdings von der Terminübersicht aufgerufen wird). Jetzt soll eben die Terminübersicht warten, bis die Termineintragung geschlossen wird und sich dann automatisch aktualisieren.

Wie löse ich das Threadfrei? (und idealerweise ohne daß ich alles in ein Classfile packe?)

lg
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π.
Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre.

Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\"

Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\".
athropos ist offline   Mit Zitat antworten
Alt 10.06.2008, 13:03   #4
Farkarich
Senior Member
 
Registriert seit: 19.09.2000
Alter: 40
Beiträge: 122


Farkarich eine Nachricht über ICQ schicken
Standard

Ganz einfach

Wenn du in einem ActionListener eine Aktion ausführst steht sowieso der Ganze SwingThread bis der Listener fertig ist. Also problem eins gelöst.

Problem 2: Aktualisieren: ich denke mal du hast deiner Termine in ner JTable oder so.

Dann schaust du einfach dass du in der 2. Klasse ne Referenz auf die Table hast und einfach im Model von der Table die fireTableDataChanged() schießt dann sollte er deine Termine lösen.
Farkarich ist offline   Mit Zitat antworten
Alt 18.06.2008, 21:55   #5
athropos
Hero
 
Registriert seit: 24.07.2001
Alter: 46
Beiträge: 801


athropos eine Nachricht über Skype™ schicken
Standard

Hi!

Danke für deine Antwort und sorry, daß ich mich länger nicht gerührt habe.

@1: nachdem ich mit dem ActionListener eine externe Gui aufrufe (quasi new...) läuft die 1. Gui normal weiter, es wird nur die 2. "dazu" aufgemacht - sprich mit 1. Gui deaktivieren, 2. aufrufen und erst wenn die wieder "geschlossen" wird, läuft die 1. weiter ist leider nicht.

@Termine: das ist mit einem Buttonarray gelöst (hat technische Gründe), ergo nix mit signal an den Table

lg, Athropos
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π.
Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre.

Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\"

Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\".
athropos ist offline   Mit Zitat antworten
Alt 18.06.2008, 23:58   #6
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard

2 einfache möglichkeiten:

In der Methode von GUI 1 die GUI 2 aufruft deaktivierst du vorher alles in GUI 1 damit nix mehr ausgeführt werden kann. Und beim Schließen von GUI2 aktivierst wiede alles und updatest die Daten.

Noch einfacher: GUI 2 als modalen Diaglog öffnen (kann man beim Öffnen angeben wie das Window geöffnet werden soll, weiß jetzt aber nimmer auswendig wie) - dann ist sowieso nur noch GUI2 aktiv und sonst kann nichts mehr angeklickt werden.
renew ist offline   Mit Zitat antworten
Alt 21.07.2008, 07:52   #7
athropos
Hero
 
Registriert seit: 24.07.2001
Alter: 46
Beiträge: 801


athropos eine Nachricht über Skype™ schicken
Standard

@renew: modaler dialog hats gebracht, DANKE! (eigentlich hab ich die antwort schon am 20. verfaßt, aber anscheinend hats der server gefressen, entschuldige die Verspätung)


@all: aufgewärmt hab ich den Thread aus folgendem Grund: ich hab immer noch ein Problem mit Threads (und mit der Tatsache, daß sich danach so bequem Googeln lässt )

Wie dem auch sei, nachdem einige Datenbankzugriffe etwas länger dauern, hab ich mir gedacht, daß so ein Fortschrittsbalken doch bequem zu haben wäre. Testhalber hab ich 3 Klassen geschrieben und im Test funktioniert es auch brav (wobei zu sagen ist, daß es nur funzt, wenn ich mit Thread.start() arbeite, bei Thread.run() ärgerlicherweise nicht)

Anbei der Code:
1) Class für den ProgressBar
Code:
public class HelloLoop implements Runnable {

  private int pValue = 0;
  private JFrame frame = new JFrame("Progress Bar Trial");
  private JProgressBar progress = new JProgressBar();
  
  public void setMaximumSize(int max) {
    progress.setMaximum(max);
  }
  public void setActualValue(int val) {
      pValue = val;
  }
  public void disableProgressBar() {
    frame.setVisible(false);
  }
  public void enableProgressBar() {
    frame.setVisible(true);
    pValue = 0;
  }
  public void run() {
      progress.setPreferredSize(new Dimension(250,25));
      progress.setValue(0);
      progress.setStringPainted(true);
      progress.setIndeterminate(false);
      frame.setLayout(new FlowLayout());
      frame.add(progress);
      frame.pack();
      
      while (true) {      
          progress.setValue(pValue);
          try { Thread.sleep(50); }
          catch (InterruptedException e) {}
    }
  }
}
2) Class mit den Datenbankspielereien (es wird einfach ein table kopiert)
Code:
public class HelloDatabase implements Runnable {
    private HelloLoop pbar;
    private int step = 0;
    
    public void setProgressBar(HelloLoop p) {
        pbar = p;
    }    
    public void rumbleDatabase() {
        pbar.setMaximumSize(variable);
        pbar.setActualValue(0);
        pbar.enableProgressBar();
        //query: daten einlesen
        //query: neuen table anlegen
        //query: daten in neuen table einfügen
        //+jeweils erhöhung der zählvariable
        pbar.disableProgressBar();
    } //end rumbleDatabase
    
    public void run() {
        while (true) {
            pbar.setActualValue(step);
            try { Thread.sleep(50); }
            catch (InterruptedException e) {}
      }
    }
}
3) "Main" class mit dem Threadstart
Code:
public class HelloThreads {
  public static void main (String[] args) {
    HelloDatabase  database = new HelloDatabase();
    HelloLoop myProgress = new HelloLoop();
    database.setProgressBar(myProgress);
    
    Thread data = new Thread (database);
    Thread bar = new Thread (myProgress);
    
    data.start();
    bar.start();
    database.rumbleDatabase();
  }
}
Wie gesagt, so funktioniert es ja schon fast zu meiner Zufriedenheit, nur wenn ich das Ganze ins "Hauptprogramm" integriere, wird nur der Rahmen vom Fenster des Fortschrittsbalkens angezeigt aber sonst passiert nix (sprich kein Inhalt und auch keine (optische) Änderung desselben. Outputs in der Kommandozeile würden passen.

Wo liegt der Fehler?
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π.
Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre.

Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\"

Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\".
athropos ist offline   Mit Zitat antworten
Antwort


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

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.

Gehe zu


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


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag