Bonjour à tous,
Contexte :
Une application avec interface graphique (Swing) exécute un script shell.
L'exécution pouvant durer un moment, elle est lancée à l'intérieur d'un thread afin de continuer à utiliser l'interface graphique, seul le bouton d'exécution devient disabled tant que le thread existe.
Dans une version antérieure le thread était créé directement dans la vue et le comportement voulu était obtenu.
Actuellement, dans un respect du pattern MVC un controller a été ajouté, le thread est créé dans ce controller.
Problème :
Durant l'exécution du shell le thread ne semble pas fonctionner, il y a donc une perte de la main sur l'interface graphique durant celui ci.
Aide souhaitée :
M'expliquer pourquoi le thread ne permet plus de garder la main sur l'interface graphique pendant que l'exécution suit son cours.
Controller :
Dans la méthode startExecution() un ExecutingThread est créé, il implémente Runnable. Le thread.start() lance donc la méthode run() d'ExecutingThread qui execute mon script.
méthode qui appelle le controller, elle est dans la vue permettant l'exécution. C'est pas très propre car générée par l'éditeur graphique de Netbeans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public class ExecutingController { private MainWindows myVue; public ExecutingController(MainWindows aVue){ this.myVue=aVue; } public void startExecution(){ if(myVue.getjRadioButton1().isSelected()){ if(myVue.getjTable1().getSelectedRow()!=-1){ Thread thread = new Thread(new ExecutingThread(((ScriptsIntoJTable)myVue.getjTable1().getModel()).getConfigAt(myVue.getjTable1().getSelectedRow()))); thread.start(); while(true){ if(!thread.isAlive()){ myVue.getjButton1().setEnabled(true); break; } } } else{ javax.swing.JOptionPane.showMessageDialog(null,"Aucune configue selectionnée"); } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: this.jButton1.setEnabled(false); this.controller.startExecution(); }
Partager