Funky Bob
2010-03-05, 10:41:30
Hallo Forum,
ich spiele gerade mit Threads rum um mich nen bissl fitter darin zu machen.
Nun habe ich ein Problem:
Ich habe einen WorkerThread erstellt, der einfach nur inkrementiert und jede xte Inkrementierung an die GUI weitergibt (jedes 10.000.000ste Inkrement, damit die GUI nicht einen Preozessor komplett auslastet).
Starten dieses WorkerThreads geht, Stoppen geht auch, keine Probleme.
Nun habe ich noch einen Knopf eingebaut, der ein wait() aufrufen soll.
Erst hatte ich noch das Problem, das ich wohl keinen Monitor auf das Objekt hatte und das wait ist mir um die Ohren geflogen, dies habe ich mit synchronized(x) aber beseitigt.
Nun wird leider der aufrufende GUI-Thread mit schlafen gelegt und ich habe keine Ahnung warum.
Hier der Code:
(Die vermutlich fraglichen Stellen farblich markiert, Grün läuft, Rot friert die GUI mit ein)
public class CustomPanel extends JPanel implements TextPush {
private JLabel infoText;
private JButton startThread;
private JButton stopThread;
private JButton waitThread;
private JComboBox chosenFunction;
private Thread workerThread = null;
public CustomPanel()
{
this.setLayout(new FlowLayout());
this.setMinimumSize(new Dimension(1,1));
String comboBoxItems[] = {"Integrate","Differentiate","Counter"};
chosenFunction = new JComboBox(comboBoxItems);
this.add(chosenFunction);
startThread = new JButton("Start Calculating");
startThread.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if(workerThread==null)
{
switch(chosenFunction.getSelectedIndex())
{
case 0:
Integrator integrator = new Integrator(new WiredFunction(), CustomPanel.this);
workerThread = new Thread(integrator);
break;
case 1:
Differentiator diff = new Differentiator(new WiredFunction(), CustomPanel.this);
workerThread = new Thread(diff);
break;
case 2:
Counter count = new Counter(CustomPanel.this);
workerThread = new Thread(count);
break;
}
workerThread.start();
} else if(workerThread.getState()==Thread.State.WAITING)
{
synchronized(workerThread) {
workerThread.notifyAll();
}
}
}
});
this.add(startThread);
stopThread = new JButton("Stop Calculating");
stopThread.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
if(workerThread != null)
{
workerThread.stop();
workerThread = null;
CustomPanel.this.setInfoText("Stopped Calculations");
}
}
});
this.add(stopThread);
waitThread = new JButton("Thread wait");
waitThread.addActionListener(new ActionListener() {
@Override
public synchronized void actionPerformed(ActionEvent arg0)
{
Thread.currentThread();
if(workerThread!=null)
synchronized(workerThread) {
try {
workerThread.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
this.add(waitThread);
infoText = new JLabel("Status: Wait\nChoose Action and Start calculating");
this.add(infoText);
}
public synchronized void setInfoText(String text)
{
this.infoText.setText(text);
}
}
Danke für die Hilfe!
Edit2:
Das Thread.currentThread() im roten Teil ist nur zum Debuggen drinne, woltle schauen ob das auch wirklich nen anderer Thread ist oder ob da sonstwas schief läuft...
ich spiele gerade mit Threads rum um mich nen bissl fitter darin zu machen.
Nun habe ich ein Problem:
Ich habe einen WorkerThread erstellt, der einfach nur inkrementiert und jede xte Inkrementierung an die GUI weitergibt (jedes 10.000.000ste Inkrement, damit die GUI nicht einen Preozessor komplett auslastet).
Starten dieses WorkerThreads geht, Stoppen geht auch, keine Probleme.
Nun habe ich noch einen Knopf eingebaut, der ein wait() aufrufen soll.
Erst hatte ich noch das Problem, das ich wohl keinen Monitor auf das Objekt hatte und das wait ist mir um die Ohren geflogen, dies habe ich mit synchronized(x) aber beseitigt.
Nun wird leider der aufrufende GUI-Thread mit schlafen gelegt und ich habe keine Ahnung warum.
Hier der Code:
(Die vermutlich fraglichen Stellen farblich markiert, Grün läuft, Rot friert die GUI mit ein)
public class CustomPanel extends JPanel implements TextPush {
private JLabel infoText;
private JButton startThread;
private JButton stopThread;
private JButton waitThread;
private JComboBox chosenFunction;
private Thread workerThread = null;
public CustomPanel()
{
this.setLayout(new FlowLayout());
this.setMinimumSize(new Dimension(1,1));
String comboBoxItems[] = {"Integrate","Differentiate","Counter"};
chosenFunction = new JComboBox(comboBoxItems);
this.add(chosenFunction);
startThread = new JButton("Start Calculating");
startThread.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if(workerThread==null)
{
switch(chosenFunction.getSelectedIndex())
{
case 0:
Integrator integrator = new Integrator(new WiredFunction(), CustomPanel.this);
workerThread = new Thread(integrator);
break;
case 1:
Differentiator diff = new Differentiator(new WiredFunction(), CustomPanel.this);
workerThread = new Thread(diff);
break;
case 2:
Counter count = new Counter(CustomPanel.this);
workerThread = new Thread(count);
break;
}
workerThread.start();
} else if(workerThread.getState()==Thread.State.WAITING)
{
synchronized(workerThread) {
workerThread.notifyAll();
}
}
}
});
this.add(startThread);
stopThread = new JButton("Stop Calculating");
stopThread.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
if(workerThread != null)
{
workerThread.stop();
workerThread = null;
CustomPanel.this.setInfoText("Stopped Calculations");
}
}
});
this.add(stopThread);
waitThread = new JButton("Thread wait");
waitThread.addActionListener(new ActionListener() {
@Override
public synchronized void actionPerformed(ActionEvent arg0)
{
Thread.currentThread();
if(workerThread!=null)
synchronized(workerThread) {
try {
workerThread.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
this.add(waitThread);
infoText = new JLabel("Status: Wait\nChoose Action and Start calculating");
this.add(infoText);
}
public synchronized void setInfoText(String text)
{
this.infoText.setText(text);
}
}
Danke für die Hilfe!
Edit2:
Das Thread.currentThread() im roten Teil ist nur zum Debuggen drinne, woltle schauen ob das auch wirklich nen anderer Thread ist oder ob da sonstwas schief läuft...