Hallo Zusammen,
ich habe eine Anwendung, die mit mehreren Threads läuft.
Es gibt die Klasse Video, welche einen Thread enthält, der dauerhaft Bilder einer angeschlossenen Kamera auswertet und eine Hauptklasse, in welcher es einen Thread gibt, der mehrere Messungen ausführt.
Der KameraThread wertet die Bilder aus stellt einige Messwerte zur Verfügung, für die es getFunktionen in der Video Klasse gibt.
Aus dem Messungsthread hole ich mir dann zu bestimmten Zeitpunkten Messergebnisse aus den getFunktionen.
Ich habe es mit Conditions -> SignalAll() und await() probiert.
Hier ein vereinfachter Code des ganzen:
Im MessThread möchte ich dann über die getFunktionen die benötigten Werte bekommen, aber vom aktuellen Bild. Ich habe nämlich aktuell ohne signalAll() und await() manchmal das Problem, dass ich die Messergebnisse eines älteren Bildes bekomme.
Ich bekomme bei signalAll() eine IllegalMonitorStateException.
Kann mir jemand erklären, warum das so ist und was ich verbessern muss?
Kann ich aus dem MessungsThread auf das Condition Objekt zugreifen und in dem Thread auf ein signalAll des VideoThreads warten?!
Gruß
TDO
ich habe eine Anwendung, die mit mehreren Threads läuft.
Es gibt die Klasse Video, welche einen Thread enthält, der dauerhaft Bilder einer angeschlossenen Kamera auswertet und eine Hauptklasse, in welcher es einen Thread gibt, der mehrere Messungen ausführt.
Der KameraThread wertet die Bilder aus stellt einige Messwerte zur Verfügung, für die es getFunktionen in der Video Klasse gibt.
Aus dem Messungsthread hole ich mir dann zu bestimmten Zeitpunkten Messergebnisse aus den getFunktionen.
Ich habe es mit Conditions -> SignalAll() und await() probiert.
Hier ein vereinfachter Code des ganzen:
Java:
public class Video extends javax.swing.JFrame
{
private final Lock lock = new ReentrantLock();
public final Condition FrameReady = lock.newCondition();
class VideoThread implements Runnable
{
@Override
public void run() {
//Hier werden die Kameradaten verarbeitet
FrameReady.signalAll();
}
}
public synchronized Point getPosition() {
if (myThread != null)
{
lock.lock();
try{
synchronized(FrameReady)
{
FrameReady.await();
}
}catch(InterruptedException ex)
{
JOptionPane.showMessageDialog(null, "Interrupted Exception in Vido.getPosition!\nFehler: " + ex.getMessage(), "Interrupted Exception", JOptionPane.ERROR_MESSAGE);
}
finally{
lock.unlock();
}
return myThread.measuredResult;
}
else return new Point(0,0);
}
public synchronized double getPosX() {
if (myThread != null)
{
lock.lock();
try{
synchronized(FrameReady)
{
FrameReady.await();
}
}catch(InterruptedException ex)
{
JOptionPane.showMessageDialog(null, "Interrupted Exception in Vido.getPosX!\nFehler: " + ex.getMessage(), "Interrupted Exception", JOptionPane.ERROR_MESSAGE);
}
finally{
lock.unlock();
}
return myThread.XX;
}
else return 0.0;
}
}
Im MessThread möchte ich dann über die getFunktionen die benötigten Werte bekommen, aber vom aktuellen Bild. Ich habe nämlich aktuell ohne signalAll() und await() manchmal das Problem, dass ich die Messergebnisse eines älteren Bildes bekomme.
Ich bekomme bei signalAll() eine IllegalMonitorStateException.
Kann mir jemand erklären, warum das so ist und was ich verbessern muss?
Kann ich aus dem MessungsThread auf das Condition Objekt zugreifen und in dem Thread auf ein signalAll des VideoThreads warten?!
Gruß
TDO