Hallo Java Freunde,
ich bin neulich auf etwas kurioses gestoßen.
In einer Klasse welche von java.lang.Thread erbt, ist wie bekannt die run() Methode implementiert, welche einen Punkt auf einen Canvas gui malt.
Während jedem Durchlauf wird der Wert der deklarierten integert Variablen lineX um eins jeweils inkrementiert. Sofern der Wert von 600 überschritten ist, wird er auf 0 zurück gesetzt.
Der Thread wird gestartet wenn die Maus über dem Canvas gui ist und der Thread wird angehalten sofern die Maus den Canvas gui verläßt. (mouseEntered() & mouseExited())
Alles funktioniert wie geplant, es wird gemalt sofern die Maus in den Canvas eintritt und das Malen wird gestoppt wenn die Maus den Canvas verläßt, realisiert mit wait() und notify().
Erst einmal der Code:
Das Problem
Nun das kuriose Problem, die Berechnung des Wertes von lineX wird jedoch "irgendwie" weiter fortgesetzt, obwohl der Thread zu diesem Zeitpunkt angehalten ist.
Ein kurze Hintergrundinformation
Warum wurde das so gelöst? Der Sinn ist folgender, sofern das Objekt erstellt und initialisiert wurde, kann der Canvas anhand von meineKlasse.getCanvas() einem Container Objekt wie einem Panel, Frame oder Applet hinzugefügt werden. Es malt sich mit seiner Logik doppelt gepuffert (double buffering).
Wer kennt dieses Problem und kann mir eine Hilfestellung geben? ???:L
Ich freue mich über jegliche Antworten und bedanke mich im Vorfeld für die freundliche Hilfe.
ich bin neulich auf etwas kurioses gestoßen.
In einer Klasse welche von java.lang.Thread erbt, ist wie bekannt die run() Methode implementiert, welche einen Punkt auf einen Canvas gui malt.
Während jedem Durchlauf wird der Wert der deklarierten integert Variablen lineX um eins jeweils inkrementiert. Sofern der Wert von 600 überschritten ist, wird er auf 0 zurück gesetzt.
Der Thread wird gestartet wenn die Maus über dem Canvas gui ist und der Thread wird angehalten sofern die Maus den Canvas gui verläßt. (mouseEntered() & mouseExited())
Alles funktioniert wie geplant, es wird gemalt sofern die Maus in den Canvas eintritt und das Malen wird gestoppt wenn die Maus den Canvas verläßt, realisiert mit wait() und notify().
Erst einmal der Code:
Java:
public class MeineClasse extends Thread
{
private volatile Canvas gui;
private volatile MouseListener mouseListener;
private volatile boolean _suspendFlag;
public Canvas getCanvas()
{
return gui;
}
public MeineClasse()
{
_suspendFlag = false;
mouseListener = new MouseListener(this);
gui = new Canvas();
gui.setBounds(0, 0, 640, 480);
gui.addMouseListener(mouseListener);
gu.addMouseMotionListener(mouseListener);
}
@Override
public void run()
{
int lineX = 0;
gui.createBufferStrategy(2);
BufferStrategy strategy = gui.getBufferStrategy();
Thread currentThread = Thread.currentThread();
while (currentThread == this)
{
try
{
currentThread.sleep(33);
if (_suspendFlag)
{
synchronized (this)
{
while (_suspendFlag)
{
wait();
}
}
}
}
catch (InterruptedException e)
{
}
// lineX wird trotz wait(); weiter berechnet
lineX = lineX > 600 ? 0 : (lineX+ 1);
g = strategy.getDrawGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, gui.getWidth(), gui.getHeight());
g.setColor(Color.BLACK);
g.drawLine(lineX, 0, lineX, 0);
g.drawString(String.valueOf(lineX), 2, 20);
strategy.getDrawGraphics().dispose();
strategy.show();
}
}
public class MouseListener extends MouseAdapter implements MouseMotionListener
{
private final DrawerBase parent;
public MouseListener(DrawerBase argParent)
{
parent = argParent;
}
@Override
public synchronized void mouseEntered(MouseEvent e)
{
e.consume();
if (parent.isAlive())
{
_suspendFlag = false;
synchronized (parent)
{
parent.notify();
}
}
else
{
parent.start();
}
}
@Override
public synchronized void mouseExited(MouseEvent e)
{
e.consume();
_suspendFlag = true;
}
}
}
Das Problem
Nun das kuriose Problem, die Berechnung des Wertes von lineX wird jedoch "irgendwie" weiter fortgesetzt, obwohl der Thread zu diesem Zeitpunkt angehalten ist.
Ein kurze Hintergrundinformation
Warum wurde das so gelöst? Der Sinn ist folgender, sofern das Objekt erstellt und initialisiert wurde, kann der Canvas anhand von meineKlasse.getCanvas() einem Container Objekt wie einem Panel, Frame oder Applet hinzugefügt werden. Es malt sich mit seiner Logik doppelt gepuffert (double buffering).
Wer kennt dieses Problem und kann mir eine Hilfestellung geben? ???:L
Ich freue mich über jegliche Antworten und bedanke mich im Vorfeld für die freundliche Hilfe.