zeitgesteuertes Multithreading für ProgressMonitor

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

ich programmiere gerade in Java ein gößeres Programm, das u. a. umfangreiche Tabellen aus anderen Programmen in JTables meines Programms einliest, was ich jeweils mit ProgessMonitors versehen möchte.

Das Problem ist, dass die Algorithmen, die mit einem ProgressMonitor versehen werden sollen,
teilweise Makros anderer Programme sind. D.h. ich kann das Inkrementieren des Progressmonitors nicht an Zählschleifen oder sonstigen Code des Algorithmus koppeln, da mir
der Code dieser Makros ja nicht vorliegt und es sowieso kein Javacode ist.

Daher bleibt mir nur das zeitgesteuerte Ausführen der Threads. Aber jeder meiner Versuche, die Threads vom ProgressMonitor und vom Algorithmus über die Systemzeit zu synchronisieren, mißlang.

Der unten stehende Coe ist ein kleineres Test-Projekt, in dem prinzipiell dieselbe Situation herrscht wie in meinem Programm: das länger dauernde Ausfüllen einer JTable.
Die Klasse CMain mit JTable und main-Methode, die Klasse Algorithm mit dem Algorithmus-Thread sowie die Klasse Progess mit dem Thread des ProgressMonitor.

Wie kann ich diese beiden Threads derart synchronisieren, dass sich regelmäßig - nur
über die Systemzeit - abwechseln ????
Natürlich soll hier keiner meine Hausaufgaben machen.
Aber wie soll ich am besten vorgehen? Ich hab schon so einiges ausprobiert: join-Methode, synchronized mit wait() und notify(), SwingUtilities, Timer und TimerTask...
Aber es kam jedes Mal nur Käse bei raus. Ich bitte um Nachsicht, wenn ich vielleicht irgendwas Naheliegendes übersehen haben sollte. Ich bin zwar keine Java-Anfängerin, sondern programmier schon recht lange damit, aber mit Multithreading hab ichs das erste Mal zu tun.

Hier der Code:
(Aber wie gesagt: Das ist nur ein Beispiel mit prinzipiell derselben Situation wie in meinem Programm. Hier sind zwar Zählschleifen, aber nicht in meinem Programm. Es hilft also nur eine Synchronisation über die Systemzeit.)

Class CMain:
package multithreading;

Code:
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JButton;
import java.lang.*;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import javax.swing.table.*;
import javax.swing.ProgressMonitor;

public class CMain extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JScrollPane scrollPane = null;

	private JTable table = null;

	private JButton cmdStart = null;
	
	private DefaultTableModel model;
	
	  //  @jve:decl-index=0:
	
	private Vector spalte;
	
	private ProgressMonitor monitor = new ProgressMonitor (this, "Vorgang läuft.", "Bitte Warten..", 0, 1000); 

	/**
	 * This method initializes scrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setViewportView(getTable());
		}
		return scrollPane;
	}

	/**
	 * This method initializes table	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private DefaultTableModel getModel() {
		if (model == null) {
			String [] columns = {"col1", "col2", "col3"};
			String [][] data = {{"data1", "data2", "data3"},
					    {"data4", "data5", "data6"},
					    {"data7", "data8", "data9"}};
			model = new DefaultTableModel(data, columns);
			
		}
		return model;
	}
	
	/**
	 * This method initializes table	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getTable() {
		if (table == null) {
			table = new JTable(getModel());
		}
		return table;
	}

	/**
	 * This method initializes cmdStart	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getCmdStart() {
		if (cmdStart == null) {
			cmdStart = new JButton();
			cmdStart.setText("START");
			cmdStart.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed()"); // TODO Auto-generated Eventstub 										//actionPerformed()
					Algorithm algo = new Algorithm (getTable(), getModel());
					Progress progress = new Progress(monitor);
					
//					algo.start();
//					progress.start();
				}
				});
		}
		return cmdStart;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				CMain thisClass = new CMain();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
				
			}
		});
	}

	/**
	 * This is the default constructor
	 */
	public CMain() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.gridx = 0;
			gridBagConstraints1.insets = new Insets(5, 5, 5, 5);
			gridBagConstraints1.anchor = GridBagConstraints.SOUTH;
			gridBagConstraints1.gridy = 1;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.fill = GridBagConstraints.BOTH;
			gridBagConstraints.gridy = 0;
			gridBagConstraints.weightx = 1.0;
			gridBagConstraints.weighty = 1.0;
			gridBagConstraints.insets = new Insets(5, 5, 5, 5);
			gridBagConstraints.gridx = 0;
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(getScrollPane(), gridBagConstraints);
			jContentPane.add(getCmdStart(), gridBagConstraints1);
		}
		return jContentPane;
	}

	 }


Class Algorithm:
Code:
package multithreading;

import java.util.Vector;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class Algorithm extends Thread {

	private JTable table;
	private Vector neueZeile;
	private DefaultTableModel model;
	
	public Algorithm (JTable tbl, DefaultTableModel mdl){
		
		table = tbl;
		model = mdl;
	}
	
	public void run (){
		algo();
	}
	/**
	 * Die Methode algo, in die Tabelle, die bereits drei Zielen enthält,
	 * werden weiter 5555 eingelsen, das DefaultTablemodel dafür erweitert.
	 * Davor jeweils längeres Hoch -oder Runterzählen.
	 */
	private void algo (){
		for (int n = 0; n < 5555; n++)	
		{		
			neueZeile = new Vector();
			int counter = 0;
			int i;
			for (i = 0; i < 999999; i++)
			{
				counter++;
			}
			neueZeile.add(n);
			neueZeile.add(counter);
			counter = 0;
			for (i = 0; i < 999999; i++)
			{
				counter--;
			}
			neueZeile.add(counter);
			
			model.insertRow(table.getRowCount(), neueZeile);
		}	
		
		System.out.println("******DONE******");

	}

}


Class Progress:
Code:
package multithreading;

import javax.swing.ProgressMonitor;

public class Progress extends Thread {
	
	private ProgressMonitor monitor;

	public Progress (ProgressMonitor pm){
		
		monitor = pm;
	}
	
	public void run(){
		for (int i = 0; i < 1000; i++)
		{
			monitor.setProgress(i);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		

		}
	}
	
	

}
 

dieta

Top Contributor
Lol, jetzt sogar dreifachpost^^

Du bekommst nicht schneller Hilfe, wenn du öfter postest!

[edit]Nein, sogar Vierfachpost (einer wurde schon gelöscht) Wow![/edit]
 
G

Gast

Gast
Sorry wegen des mehrfachen Postings :oops:

Mein Browser zeigte "Seite kann nicht angezeigt werden ..bla...".
Daher dachte ich, dass auch das Posten nicht geklappt hätte.
Hoffe, mir wird trotzdem geholfen. :wink:
 

André Uhres

Top Contributor
Du übergibst dem Progress den zu überwachenden Algorithm.
Wenn der Algorithm fertig ist, brichst du ab.
Code:
class Progress extends Thread {
    private ProgressMonitor monitor;
    private Algorithm algo;
    public Progress(ProgressMonitor pm, Algorithm algo){
        this.algo = algo;
        monitor = pm;
    }
    public void run(){
        for (int i = 0; i < 1000; i++) {
            monitor.setProgress(i);
            if(!algo.isAlive()){
                monitor.setProgress(monitor.getMaximum());
                break;
            }
...
        }
    }
}
 
G

Gast

Gast
@ Andre Uhres
Erstmal ein großes DANKESCHÖN. Es hat geklappt, zumindest für
einige meiner Einlesevorgänge.

Aber ich hab ein wieteres Problem. Bei den Algorithmen, die über Makros
externer Programme laufen ist es so, daß der ProgressMonitor nur ein paar mal
ganz kurz aufflackert oder gar nicht zu sehen ist, weil der nur Algorithmus-Thead
läuft und der wohl den Prozessor für sich beansprucht und der Progreessmonitor- Thread
gar icht mehr zum Zuge kommt.


Ich hatte daher Thread-Prioritäten für den Algo auf MIN_PRIORITY und für den ProgressMonitor
auf MAX_PRIORITY gesetzt, aber es half nichts. Hab auch versucht mit interrupt() und sleep() den Algo anzuhalten -vergeblich. Kann es sein, dass bei Threads, in denen externe Programme ausgeführt werden, die üblichen Methoden des Multithreadings keine gänzliche kontrolle über die Verteilung der Rechenzeit mehr gewährleisten??? Vielleicht weil es dann schon ein anderer Prozess ist und Threads ja nur Teile
eines Prozesses sind? Oder ist dem nicht so?

Wenn nicht, wie kann ich dafür sorgen, dass der ProgressMonitor auch beim Ausführen eines externen Programms weiterhin Rechenzeit zugeteilt bekommt? Die Threads müssen sich ja wechselseitig ausschließen - also Monitoring.
Aber synchronized mit wait() und notify() wär wohl eher was für Multithreading, das über den Code (I/O etc.) synchronisiert wird. Bei Timer und TimerTask hab ich das Problem, dass ich damit einen Thread ganz abarbeiten lassen müsste. Aber für ein sich Abwechseln der Threads muß der Algorithmus-Thread ja immer an der letzten Stelle weitermachen, an der er aufhörte.
Weiß jemand wie sich das realisieren läßt??
 
G

Gast

Gast
Huhu,
weiß keiner ne Antwort? Wär schon hilfreich, wenn mir wenigstens jemand diese Fragen beantworten könnte:

[quote="Gast] Kann es sein, dass bei Threads, in denen externe Programme ausgeführt werden, die üblichen Methoden des Multithreadings keine gänzliche kontrolle über die Verteilung der Rechenzeit mehr gewährleisten??? Vielleicht, weil es dann schon ein anderer Prozess ist und Threads ja nur Teile
eines Prozesses sind? Oder ist dem nicht so?
[/quote]

----

Ansonsten hab ich hierbei auch noch das Problem, dass ich nich genau weiß, wie lang die Einlesevorgänge dauern.
Bei Installatiosvorgängen z. B. gibts doch auch einen Ladebalken, der immer nur von links nach rechts hin -und herläuft und sich daher für Ladevorgänge unbestimmter Dauer gut eignet. Ich hab nach einer entsprechenden Swingkomponente für Java gegoogelt und in der Klassendoku gesucht, aber nichts gefunden.
Gibt es so eine Swingkomponente überhaupt?
 

André Uhres

Top Contributor
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Multithreading with SwingWorkers in ExecutorService AWT, Swing, JavaFX & SWT 1
Maxim6394 Multithreading in SWT AWT, Swing, JavaFX & SWT 1
H Multithreading & Swing AWT, Swing, JavaFX & SWT 7
DerEisteeTrinker Swing Swing ist zu schnell für Multithreading AWT, Swing, JavaFX & SWT 18
A Swing Swing + Multithreading :: IllegalMonitorStateException AWT, Swing, JavaFX & SWT 4
SuperSeppel13 Multithreading und awt.EventQueue AWT, Swing, JavaFX & SWT 7
A Wie folgendes am besten realisieren (Multithreading.) AWT, Swing, JavaFX & SWT 16
M Problem mit System.setOut()/setErr() und MultiThreading AWT, Swing, JavaFX & SWT 11
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
F Konstruktor für "Vier Gewinnt" AWT, Swing, JavaFX & SWT 10
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
R Swing Welche LayoutManager sind die richtigen für mich? AWT, Swing, JavaFX & SWT 11
L Event Handling Gui für Taschenrechner AWT, Swing, JavaFX & SWT 27
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
OnDemand Gui Themes für FX AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
D GUI-Bau für ein Auswertungs-Tool AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4
H Applet Flappy Bird für Noobs AWT, Swing, JavaFX & SWT 4
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
T Hintergrund für GUI AWT, Swing, JavaFX & SWT 1
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
C JavaFX Character Comparator für TableColumn AWT, Swing, JavaFX & SWT 0
KrokoDiehl JavaFX Gleiche Controller-Instanz für inludiertes FXML AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben