Bonjour
J'ai vu que les méthodes stop, suspend et resume étaient dépréciées, mais il n'y a pas a priori de remplacement.
Comment puis-je suspendre, stopper ou reprendre, à partir d'une IHM, un thread fils si ce n'est en utilisant ces méthodes?
merci
Bonjour
J'ai vu que les méthodes stop, suspend et resume étaient dépréciées, mais il n'y a pas a priori de remplacement.
Comment puis-je suspendre, stopper ou reprendre, à partir d'une IHM, un thread fils si ce n'est en utilisant ces méthodes?
merci
tu peux ecrire un code qui realise le stop()
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 private boolean stop = false; public void run() { boolean termine = false; while( !termine ) { try { // traitement de chaque thread synchronized(this) { Thead.yield(); // lecture du boolean termine = this.stop; } } catch( InterruptedException e ) { } } } public synchronized void stop() { this.stop = true; }
Cette méthode fonctionne uniquement si le code de la méthode run() autorise un test régulier d'un boolean. On n'obtiendra jamais un arrêt instantanné de l'exécution du thread.
Je n'avais pas vu la première fois, mais faire un Thread.yield() n'a pas beaucoup d'interet, surtout la ou il est place. Parce que si c'est pour donner une meilleur chance aux autres threads d'arreter celui-ci, c'est loupé, comme le monitor est déjà pris.
Sinon, si c'est pour donner la main aux autres threads de temps et en temps, c'est également inutile. Il vaut mieux laisser la vm faire le boulot.
J'ai regardé dans la faq.Bon pour le stop OK mais pour la pause. Je souhaiterais réellement le mettre en pause. Est-il envisageable d'utiliser un wait et de le réveiller de l'extérieur par un notify.
Est-ce propre?
Oui, c'est effectivement ce qu'il faut faire.Est-il envisageable d'utiliser un wait et de le réveiller de l'extérieur par un notify.
Est-ce propre?
Je n'arrive pas à générer à appeler mes méthodes.
L'ihm est vivant car les boutons changent d'aspect lorsque la souris est dessus ou lorsque je clique dessus.
Le pb est que j'ai l'impression et même la certitude qu'il ne rentre pas dans la méthode.
voici le code de la méthode appelée pour l'événement "mouseClicked"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 private void btnStopStateChanged(java.awt.event.ItemEvent evt) { // TODO add your handling code here: if(rn!=null) { btnLance.setEnabled(true); btnPause.setEnabled(false); btnStop.setEnabled(false); rn.stoppe(); } } }
Peux tu poster le code de stoppe() et la synchron du thread stp?
le code suivant est dans une fonction appelée dans la méthode run.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public synchronized void stoppe() { this.stopThread=true; }
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public void melangeVecteurParams() { int n1; int e; boolean stop=false; ParamEspece pe1,pe2,peAux; ihm.setValMinMaxMelange(0,params.size()-1); ihm.setTextZoneInfos("Début mélange des paramètres\n"); e=0; while((e<params.size()) && (stop==false)) { ihm.setValMelange(e); // Recherche d'un emplacement aléatoire pour faire l'échange do { n1=(int)(java.lang.Math.random()*params.size()); }while((n1>params.size()-1)||(n1==e)); pe1=(ParamEspece)params.get(n1); pe2=(ParamEspece)params.get(e); params.set(e,(Object)pe2); params.set(n1,(Object)pe1); /*try { this.sleep(100); } catch (InterruptedException ex) { ex.printStackTrace(); }*/ synchronized(this) { stop=this.stopThread; this.yield(); } e++; } if(stop) { ihm.setTextZoneInfos("Mélange des paramètres stoppé\n"); acquitteStop(); // pour remettre à false le stopThread } else ihm.setTextZoneInfos("Fin mélange des paramètres\n"); }
Je ne vois pas ce qui ne va pas.
Si tu ne rentres pas dans stoppe (j'imagine que tu as verifie avec des traces ou au debugger), c'est que le verrou est déjà pris, et il faut trouver par qui.
Juste un truc, le Thread.yield() n'a pas de raison d'être dans le bloc synchronized.
bon il y avait une erreur de ma part
j'ai tracé et jai relevé le pb suivant. Tout d'abor le code que j'ai dans un fonction appelée par la méthode run.
et le code de la méthode appelée par l'ihm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 while((e<params.size())&&(stop==false)) { ..... synchronized(this) { stop=stopThread; //pause=pauseThread; this.yield(); } e++; }
Le stopThread passe bien à 1, mais lorsque je suis dans la 1ère fct il n'est plus à 1 mais à 0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public synchronized void stoppe() { synchronized(this) { this.stopThread=true; } }
Partager