Bonjour à tous,
J'ai un petit problème avec mon logiciel. J'ai developpé une IHM qui visualise en temps réel des aéronefs. J'ai un thread qui lit les données des aéronefs et mon "main" qui lance mon IHM. Je voudrais pouvoir ajouter une fonction pause à mon IHM c'est à dire lorsque je clique sur ce bouton, le thread qui lit les données des aéronefs se met en pause. J'ai donc fait un wait() sur ce thread, mais le probleme c'est que tout se bloque ! je ne peux plus rien toucher sur l'appli. je vous montre quelques bouts de code pour mieux comprendre :
public class LuciadDataModelLoopThread extends DataModelLoopThread {
public LuciadDataModelLoopThread(DataModelLoop genLoop)
{
super (genLoop);
}
public void run()
{
try{
while (LuciadMain.getVisualisation() == false)
{
sleep(1);
}
}catch (Exception e) {
System.out.println("erreur: " + e.getMessage());
}
super.run ();
}
}
public class FileMain {
public static void main(String[] args) {
try {
/...../
FlightModel model = new FlightModel ();
FileDataModelLoop loop = new FileDataModelLoop (model, dataFile);
loop.setSpeedFactor (speedFactor);
LuciadDataModelLoopThread thread=new LuciadDataModelLoopThread(loop);
LuciadMain main = new LuciadMain (loop, thread);
main.run (args, thread);
} catch (IOException ioe) {
System.err.println ("Can't create default configuration " + Configuration.getDefaultConfiguration ());
ioe.printStackTrace ();
}
}
}
public class LuciadMain extends AbstractMain{
public LuciadMain(DataModelLoop loop, Thread _thread)
{
super(loop);
//try { java.lang.Thread.sleep(2000); } catch (java.lang.Exception e) { System.out.println("Exception in sleep : " + e); }
System.out.println("LuciadMain constructor");
trackModel=new TrackModel(new TLcdLonLatBounds( 35, 40, 35, 30 ));
cometModel=new CometModel(new TLcdLonLatBounds( 35, 40, 35, 30 ));
speedVectorModel=new SpeedVectorModel(new TLcdLonLatBounds( 35, 40, 35, 30 ));
/*HmiController*/ controller = new HmiController (trackModel, cometModel, speedVectorModel); //controleur doit etre global et static
addObserver (controller);
this.thread=_thread;
}
protected void createAndShowGui ()
{
System.out.println("createAndShowGui");
frame=new JFrame("IESTA - Fédéré de Visualisation 2D");
//add panelFreeze
panelFreeze=new PanelFreeze(thread);
frame.add(panelFreeze,BorderLayout.SOUTH);
frame.setVisible(true);
/..../
visualisation=true;
}
}
public class PanelFreeze extends JPanel{
private JToggleButton buttonPause;
private JSlider sliderTime;
private final Thread thread;
public JToggleButton getButtonPause()
{
return buttonPause;
}
public PanelFreeze(Thread _thread)
{
this.thread=_thread;
this.setPreferredSize(new Dimension(1200,35));
this.setVisible(true);
this.setLayout(new BorderLayout());
JToolBar toolBar = new JToolBar();
this.add(toolBar, BorderLayout.WEST);
toolBar.setOrientation(toolBar.HORIZONTAL);
buttonPause=new JToggleButton("Pause",false);
buttonPause.setBorderPainted(true);
toolBar.add(buttonPause);
buttonPause.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ev) {
pauseThread(thread);
}
});
sliderTime= new JSlider();
this.add(sliderTime);
}
public void pauseThread(Thread _thread) {
synchronized (_thread) {
while (buttonPause.isSelected())
try {
_thread.wait();
} catch (InterruptedException exc) {
System.out.println("Erreur = " + exc.getMessage());
}
}
}
}
Bon j'ai essayé de raccourcir au maximum. Donc la classe LuciadDataModelLoopThread est bien le thread que je veux mettre en pause. Je vous demande si vous avez une idée du pourquoi ça me bloque tout quand j'appuie sur ce fichue bouton.
Partager