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;
Class Algorithm:
Class Progress:
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();
}
}
}
}