WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Java Threads - howto? (http://www.wcm.at/forum/showthread.php?t=228802)

athropos 09.06.2008 14:44

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

Farkarich 10.06.2008 08:48

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...

athropos 10.06.2008 12:31

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

Farkarich 10.06.2008 13:03

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.

athropos 18.06.2008 21:55

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

renew 18.06.2008 23:58

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. ;)

athropos 21.07.2008 07:52

@renew: modaler dialog hats gebracht, DANKE! :bier: (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 :hammer: )

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?


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:45 Uhr.

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