class in neuen Thread auslagern

Status
Nicht offen für weitere Antworten.
P

PaulK

Gast
Hallo an alle,

erstmal zu Situation: Ich bin dabei, ein Programm zum Überpüfen, ob eine Zahl prim ist, zu schreiben. Das Ganze wird in 2 Dateien (GUI und Algorithmus) und mit der BigInteger-Klasse realisisiert.
Um dem Benutzer eine Abschätzung der Rechenzeit zu ermöglichen, hab ich eine jprogressbar eingebaut. Allerdings schaffe ich es nicht, den value() dieser aus der 2. Datei heraus zu ändern. Mein zweites Problem ist, dass die Progressbar erst nach dem kompletten Schleifendurchlauf aktualisiert würde. Ich habe dazu viel gelesen und halte es für sinnvoll, den Algorithmus in einen extra Thread auszulagern. Allerdings weiß ich nicht, wie :cry:. Ich hab viel rumprobiert, bin aber zu keiner funktionierenden Lösung gekommen.

Ich würde mich freuen, wenn mir jemand einen Ansatz (auch mit Code :wink:) geben könnte, wie ich mein Programm verändern muss, damit die progressbar richtig funktioniert.

PS: Der Algorithmus an sich ist erstmal nur schnell "hingeschmiert" und noch gar nicht optimiert, aber um den geht es ja nicht...

mfG PaulK

GUI:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class pz_GUI extends JFrame {
  // Anfang Variablen
  private JLabel jLabel1 = new JLabel();
  private JTextField txtZahl = new JTextField();
  private JButton cmdPruefen = new JButton();
  private JScrollPane jScrollPanetxtAusgabe = new JScrollPane();
  private JTextArea txtAusgabe = new JTextArea("");
  private JButton cmdEnde = new JButton();
  private JProgressBar pgbFortschritt = new JProgressBar();
  
  pz_BigInt p = new pz_BigInt();
  // Ende Variablen

  public pz_GUI(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 843;
    int frameHeight = 267;
    setSize(frameWidth, frameHeight);
    setTitle("Primzahlen");
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    
    // Anfang Komponenten

    jLabel1.setBounds(8, 10, 30, 13);
    jLabel1.setText("Zahl:");
    jLabel1.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
    cp.add(jLabel1);
    txtZahl.setBounds(43, 8, 782, 21);
    txtZahl.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
    txtZahl.setText("");
    txtZahl.setHorizontalAlignment(4);

    cp.add(txtZahl);
    cmdPruefen.setBounds(609, 39, 217, 22);
    cmdPruefen.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
    cmdPruefen.setText("auf Primzahl überprüfen");
    cp.add(cmdPruefen);
    cmdPruefen.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        cmdPruefenActionPerformed(evt);
      }
    });

    cmdEnde.setBounds(610, 199, 217, 23);
    cmdEnde.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
    cmdEnde.setText("Beenden");
    cp.add(cmdEnde);
    cmdEnde.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        cmdEndeActionPerformed(evt);
      }
    });

    pgbFortschritt.setBounds(8, 72, 817, 16);
    cp.add(pgbFortschritt);

    jScrollPanetxtAusgabe.setBounds(8, 97, 818, 91);
    txtAusgabe.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
    txtAusgabe.setText("Copyright © Richard Schwark 2007\n");
    txtAusgabe.setEditable(false);
    jScrollPanetxtAusgabe.setViewportView(txtAusgabe);
    cp.add(jScrollPanetxtAusgabe);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  public void cmdPruefenActionPerformed(ActionEvent evt) {
    txtAusgabe.setText(txtAusgabe.getText() + "\n" + p.istPrim(txtZahl.getText()));
  }

  public void cmdEndeActionPerformed(ActionEvent evt) {
    System.exit(0);
  }
  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new pz_GUI("pz_GUI");
  }
}

Algorithmus:
Code:
import java.math.BigInteger;

public class pz_BigInt {

  public String istPrim (String strZahl) {
      BigInteger Zahl = new BigInteger(strZahl);
      BigInteger Zwei = new BigInteger("2");
      BigInteger Drei = new BigInteger("3");
      BigInteger Hundert = new BigInteger("100");
      BigInteger Rest = new BigInteger("0");
      BigInteger i = new BigInteger("0");
      BigInteger Haelfte = new BigInteger("0");
      BigInteger Prozent = new BigInteger("0");
      BigInteger pzI = new BigInteger("0");
      int intProzent=0;

      Haelfte=Zahl.add(BigInteger.ONE);     // SchleifenEnde
      Haelfte=Zahl.divide(Zwei);
      Rest=Zahl.mod(Zwei);                  // Rest der Division

      if (Rest.equals(BigInteger.ZERO)) {    // -> gerade Zahlen aussortieren
        if (Zahl.compareTo(Zwei)==0) {       // Zahl=2
          return "Primzahl: "+strZahl+"!";
        } else {
           return "Keine Primzahl, da "+strZahl+" / 2 = "+Zahl.divide(Zwei)+"!";
        }
      } else {
          i=Drei;

          while (i.compareTo(Haelfte) != 1) {
            Rest=Zahl.mod(i);
            if (Rest.equals(BigInteger.ZERO)) {
              return "Keine Primzahl, da "+strZahl+" / "+i+" = "+Zahl.divide(i)+"!";
            }

            pzI=i.multiply(Hundert);

            Prozent=pzI.divide(Haelfte);
            intProzent=Prozent.intValue();

        //    pgbFortschritt.setValue(intProzent);

            i=i.add(Zwei);
          }
          if (Zahl.compareTo(BigInteger.ONE)!=0) { // Zahl != 1 (keine Primzahl)
            return "Primzahl: "+strZahl+"!";
          }else {
            return "Keine Primzahl: "+strZahl+"!";
          }

      }

    }
}
 
B

Beni

Gast
Ein ganz kleines Beispiel, wie man so einen Algorithmus in einen Thread auslagern könnte:
Code:
package forum;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Beispiel extends JFrame{
    private JProgressBar bar = new JProgressBar();
    private JButton button = new JButton( "Start" );
    private JTextField number = new JTextField();
    private JLabel result = new JLabel();
    
    public static void main( String[] args ) {
        Beispiel beispiel = new Beispiel();
        beispiel.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        beispiel.pack();
        beispiel.setVisible( true );
    }
    
    public Beispiel(){
        setTitle( "Beispiel" );
        
        JPanel panel = new JPanel( new FlowLayout());
        number.setColumns( 8 );
        number.setText( "599999" );
        result.setText( "Resultat kommt hierhin" );
        panel.add( number );
        panel.add( result );
        panel.add( button );
        
        add( panel, BorderLayout.CENTER );
        add( bar, BorderLayout.SOUTH );
        
        button.addActionListener( new ActionListener(){
            public void actionPerformed( ActionEvent e ) {
                start();
            }
        });
    }
    
    public void start(){
        try{
            // Den Algorithmus starten
            long check = Long.parseLong( number.getText() );
            
            button.setEnabled( false );
            number.setEnabled( false );
            PrimAlgorithmus algo = new PrimAlgorithmus( check, this );
            algo.start();
        }
        catch( NumberFormatException e ){
            e.printStackTrace();
        }
    }
    
    public void setAsynchronProgress( final long max, final long value ){
        // Mit der GUI darf man nur indirekt kommunizieren, ein direkter
        // Zugriff aus dem falschen Thread könnte die GUI durcheinanderbringen
        EventQueue.invokeLater( new Runnable(){
            public void run() {
                double factor = ((double)Integer.MAX_VALUE) / max / 2.0;
                
                bar.setMaximum( (int)(max * factor));
                bar.setValue( (int)(value * factor));
                result.setText( value + " / " + max );
            } 
        });
        
        // Das hier hält den aktuellen Thread an, und lässt andere
        // Threads arbeiten.
        Thread.yield();
    }
    
    public void setAsynchronResult( final String text ){
        EventQueue.invokeLater( new Runnable(){
            public void run() {
                button.setEnabled( true );
                number.setEnabled( true );
                result.setText( text );
                bar.setValue( 0 );
            }
        });
    }
}

class PrimAlgorithmus extends Thread{
    private long check;
    private Beispiel beispiel;
    
    public PrimAlgorithmus( long check, Beispiel beispiel ){
        this.check = check;
        this.beispiel = beispiel;
    }
    
    @Override
    public void run() {
        if( check <= 0 )
            beispiel.setAsynchronResult( "Zahl zu klein" );
        else if( check == 1 )
            beispiel.setAsynchronResult( "Keine Primzahl" );
        else if( check == 2 )
            beispiel.setAsynchronResult( "Primzahl" );
        else{
            // Durch alle Zahlen teilen, und den Fortschritt
            // jeweils der GUI mitteilen.
            long max = check-1;
            for( long i = 2; i <= max; i++ ){
                if( check % i == 0 ){
                    beispiel.setAsynchronResult( "Keine Primzahl" );
                    return;
                }
                
                beispiel.setAsynchronProgress( max, i );
            }
            
            beispiel.setAsynchronResult( "Primzahl" );
        }
    }
}
 
P

PaulK

Gast
Danke Beni!

Ich werde gleich mal versuchen, das Beispiel in meinem Programm umzusetzen und melde mich dann später nochmal...

PK
 
P

PaulK

Gast
OK, also ich hab das Beispiel jetzt ausprobiert und angepasst. Ich kann es auch leicht auf meinen Algorithmus übertragen + in 2 Dateien aufsplitten.

Vielen Dank nochmal!

PK
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Klassen wie würde das in einer neuen class aussehen Java Basics - Anfänger-Themen 6
T IntelliJ / SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". Java Basics - Anfänger-Themen 4
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
M error: '.class' expected switch(char) Java Basics - Anfänger-Themen 32
123456789sssssaaaa Java Wrapper Class Java Basics - Anfänger-Themen 13
FHEFHJHFJH error: class names, 'summe_bsp', are only accepted if annotation processing is explicitly requested Java Basics - Anfänger-Themen 3
N Variabel in eine class mit "extends JLabel" übertragen Java Basics - Anfänger-Themen 2
J Methode als Class anlegen Java Basics - Anfänger-Themen 7
A Fehler beim Ausführen einer class Datei Java Basics - Anfänger-Themen 6
G Could not initialize class “NoClassDefFoundError" Java Basics - Anfänger-Themen 2
Mr_Kleeblatt Operatoren if (arri[i] != "test.java"&& arri[i] != "test.class") Java Basics - Anfänger-Themen 3
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
J Klassen .class Datei öffnen Java Basics - Anfänger-Themen 31
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
O Verständniss Problem bei abstract class Java Basics - Anfänger-Themen 7
H .class Datei wird nicht ausgeführt Java Basics - Anfänger-Themen 2
H .jar unterschied .class Java Basics - Anfänger-Themen 3
J class version 52 und 56 Java Basics - Anfänger-Themen 6
L Fehler bei der AUsführung der .class Datei Java Basics - Anfänger-Themen 23
A Class not found - Jar liegt am classpath Java Basics - Anfänger-Themen 2
A Wie erkennt die JVM welche class verwendet werden muss? Java Basics - Anfänger-Themen 3
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
J Methoden Methoden einer public class AutoCompleteTextField verwenden Java Basics - Anfänger-Themen 14
R HTTP-Links in Java Class finden Java Basics - Anfänger-Themen 3
D jsoup get class name mit leerzeichen Java Basics - Anfänger-Themen 7
D doc.seect jsouo bestimmtes class element finden Java Basics - Anfänger-Themen 1
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
N Fehlende .class Datei Java Basics - Anfänger-Themen 4
S Daten aus eigenständiger .class-Datei abrufen Java Basics - Anfänger-Themen 1
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
W Externe class in Eclipse importieren Java Basics - Anfänger-Themen 0
X Variablen Problem bei Aufteilung in verschiedene Class-Files Java Basics - Anfänger-Themen 4
Javafan01 Dateiname und Public class Java Basics - Anfänger-Themen 4
S Klassen Class mit Funktionen importieren Java Basics - Anfänger-Themen 1
L jar, class, java und wieder zurück Java Basics - Anfänger-Themen 8
T class Datei auslesen Java Java Basics - Anfänger-Themen 5
B Classpath Class lässt sich nicht öffnen Java Basics - Anfänger-Themen 3
J Compiler-Fehler Fehler bei Vektor (E extends Object declared in class Vector) Java Basics - Anfänger-Themen 9
temi Verständnisproblem Class.forName() Java Basics - Anfänger-Themen 3
S setText aus anderer class heraus Java Basics - Anfänger-Themen 6
L Classpath Zwei Bibliotheken enthalten gleiche .class Datei Java Basics - Anfänger-Themen 6
F Taschenrechner "Error loading class..." Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
wilmaed protected class Java Basics - Anfänger-Themen 0
C Erste Schritte Fehler beim *.class Aufruf über cmd.exe Java Basics - Anfänger-Themen 9
N class in class Java Basics - Anfänger-Themen 13
B Linux - Error: Could not find or load main class application.Main Java Basics - Anfänger-Themen 28
V Was bewirkt das Schlüsselwort extends in Verbindung mit class bzw. public class ? Java Basics - Anfänger-Themen 2
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
P could not find main class obwohl da Java Basics - Anfänger-Themen 17
UnityFriday method getPrevious in class List<ContentType> cannot be applied to given types Java Basics - Anfänger-Themen 29
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
D Compiler-Fehler error: .class expected Java Basics - Anfänger-Themen 2
S Dataflow von Start bis die SystemProperties class Java Basics - Anfänger-Themen 1
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
M Scanner class Java Basics - Anfänger-Themen 6
A attach source: Zusammenhang zwischen JAR und .class/.java Dateien? Java Basics - Anfänger-Themen 2
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
C Klassen Class Files nachladen (mehrer .jar Dateien) Java Basics - Anfänger-Themen 2
P Compiler-Fehler Could not load or find main class fehler Java Basics - Anfänger-Themen 15
J Gestaltung der GUI.class Java Basics - Anfänger-Themen 1
P Compiler-Fehler could not find or load main class Java Basics - Anfänger-Themen 5
Z Gleiches Verzeichnis für class und java unter Windows Muss? Java Basics - Anfänger-Themen 11
S Class Dateien decompilieren Java Basics - Anfänger-Themen 4
D neue public static class variablen in array speichern? Java Basics - Anfänger-Themen 6
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
S Vererbung Fehlermeldung: the hierarchy of the type "class name" is inconsistent Java Basics - Anfänger-Themen 10
J Erste Schritte .class datei in meine form inkludieren Java Basics - Anfänger-Themen 3
O Objekt weitergeben Meth Class NullPointerException Java Basics - Anfänger-Themen 2
M Class Datein aus einen Unterordner verwenden Java Basics - Anfänger-Themen 2
B .class-File mit Reflection auslesen Java Basics - Anfänger-Themen 8
C class in main aufrufen (SWT Oberfläche) Java Basics - Anfänger-Themen 5
P Compiler-Fehler .java Dateien kompilieren und .class Dateien zur .jar Java Basics - Anfänger-Themen 4
D error: Class names, >>>HILFE, anfänger<<< Java Basics - Anfänger-Themen 4
M Class nach Namensänderung nicht mehr vorhanden Java Basics - Anfänger-Themen 6
P .class 2 .exe ? Java Basics - Anfänger-Themen 5
N Compiler-Fehler HundTestlauf class Fehler Java Basics - Anfänger-Themen 4
S Class File Editor gibt beim Start der Programms die Fehlermeldung Source not found aus Java Basics - Anfänger-Themen 1
3 OOP static class in einer Klasse Java Basics - Anfänger-Themen 6
H Umgebungsvariable In DOS-Box läuft die fehlerfreie Class-Datei nicht. Java Basics - Anfänger-Themen 5
J Compiler-Fehler bootstrap class path not set in conjunction with -source 1.6 Java Basics - Anfänger-Themen 2
J Interface compatible to a class Java Basics - Anfänger-Themen 7
Phil42 "Local variable i is accessed from within inner class" Java Basics - Anfänger-Themen 3
F .class expected Java Basics - Anfänger-Themen 3
S Erste Schritte Ausführen einer Class Datei Java Basics - Anfänger-Themen 6
C Klassen Minesweeper Problem. int needs to be final (inner class problem) Java Basics - Anfänger-Themen 3
K Frage zu Class Operator Java Basics - Anfänger-Themen 2
G Threads SuM Class Animation Java Basics - Anfänger-Themen 13
F Befehle von Java class ausführen Java Basics - Anfänger-Themen 3
G default class type Java Basics - Anfänger-Themen 3
Luk10 Generisches Class<...>[] Java Basics - Anfänger-Themen 15
Luk10 instanceof Class<T> Java Basics - Anfänger-Themen 6
N Probleme mit Class in andere Class adden (Cardlayout) Java Basics - Anfänger-Themen 2
R Classpath Setzen von class Verzeichnissen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben