Suspendre thread

didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 13 févr. 2007 à 14:50
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 14 févr. 2007 à 21:18
Bonjour a tous.
je debut un peut avec les threads et j'ai un petit soucis.
Donc voila, j'aimerais suspendre un thread et pouvoir le relancer comme si il ne s'etait pas arreter.
j'ai essaye les methodes ".stop()" et ".start()" mais elles me l'arrete et me le lance comme si il n'avait jamais ete lancer.
j'ai trouver deux autres methodes sur internet qui me permettent cela ("suspend()" et "resume()") seulement elles m'empechent de pouvoir utiliser d'autre thread (plusieur fois la meme class).
Donc est ce qu'il existerait des methodes qui me permettent de mettre en "pause" mon thread et de le relancer (le faire repartir a l'endroit ou il a ete mit en pause) ?

merci.

12 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
13 févr. 2007 à 17:56
suspend sur l'instance du thread ne fonctionne pas ?
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
13 févr. 2007 à 18:05
nn, en tous cas elle ne semble pas s'effectuer: dans ce thread j'enregistre des flux dans un fichier. lorsuqe je suspend le thread, l'enregistrement est sance etre suspendu; seulement dans le fichier il n'y a aucune "coupure" le son est toujours fluide...
merci.
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 18
13 févr. 2007 à 18:09
Comme ça peut être ?
A utiliser dans le thread coupable :

while (condition_arret) {
    Thread.yield();
}

stop(), suspend() et resume() sont dépréciés et susceptibles de créer des verrous mortels (deadlock) dixit la doc.

Sinon il y a les thread synchronisés.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
13 févr. 2007 à 18:29
En même temps, pour quelle raison as-tu besoin d'interrompre un thread ?

Pour faire un sémaphore, il existe plus simple !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
13 févr. 2007 à 18:35
Bonjour.
ta methode "bloque" mon programme. Tout a l'heure dans le train j'avais pense a un truc comme ca:
"boolean Suspendre = true;
public void Suspendre(){
   Suspendre = true;
   while (Suspendre){
      try{
         this.sleep(100);
      }catch (Exception ex){}
   }
}

public void Reprendre(){
   Suspendre = false;
}"

Ces deux methode bloque mon interface graphique (donc je pense le programme) ce qui empeche l'utilisateur de relancer le thread.

merci.
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
13 févr. 2007 à 18:36
mon prgramme enrgistre des flux (des musiques ...) donc en permettant la mise en pause de mon thread, je permet en quelque sorte a l'utilisateur des "couper" ses morceaux.

Tu as parler d'un solution plus simple, quel est - elle ?
merci
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
13 févr. 2007 à 19:20
Je te parlais du système de sémaphore, donc ce n'est pas vraiment applicable dans ton cas : les sémaphores, c'est faire attendre un thread tant que les autres ne sont pas arrivé au même point, ou bloquer un thread tant qu'un autre utilise une ressources partagée.

Mais pour ce que tu cherche à faire, tu es sûr d'avoir besoin d'interrompre une thread pour cà ?

Dans ton code, tu fait un this.sleep, donc cela s'applique à la classe où est déclarée ta procédure Suspendre, tu es sûr que tu as mis cette méthode dans la classe du thread à interrompre ?

J'utilise le suspend() pour un jeu que j'ai fait (en l'occurence mario), et ca marche nickel : un suspend mets en pause le jeu, bien que tout le reste soit exécuté normalement, et lorsque je fait un resume, le jeu reprend...
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 18
13 févr. 2007 à 19:23
les méthodes sleep() et yield() sont des méthodes de classe.
this.sleep(100); // tu dois avoir un warning
Thread.sleep(100); // passe le thread courant à l'état bloqué pendant 100 ms.

Ta méthode marche peut être. Mais c'est une implémentation un peu barbare des sémaphores. Dans la mesure où sleep() est interruptible et ton thread peut recommencer avant le moment voulu. D'autre part comme Suspendre semble commun à tous les thread (non verouillé comme un sémaphore), tous les thread peuvent le modifier.
Si yield() bloque ton programme c'est peut être parce que tu l'invoques dans le mauvais thread.

Juste quelques idées...
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
13 févr. 2007 à 19:35
Effectivement, je n'avais pas pense a, tout simplement suspendre l'enregistrement.
si non, ma methode suspendre est dans ma class (cette class herite de la class Thread).

Ca y est!!! j'ai reussit a trouver un compromi avec les methode suspend() et resume() seulement unnouveau pb est "apparu".
J'ai une methode "Arreter" qui detrui le thread. lorsque j'utilise ces deux methodes, java me genre une exception quand je clique sur ce bouton.

Quest ce qui se passe ?

merci.
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
13 févr. 2007 à 19:37
(AlexN)
Donc dans ce cas qu'elles solution s'offrent a moi ?
merci.
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 18
14 févr. 2007 à 13:20
Salut,

"mon prgramme enrgistre des flux (des musiques ...) donc en permettant
la mise en pause de mon thread, je permet en quelque sorte a
l'utilisateur des "couper" ses morceaux."

Je ne comprend pas bien ce que tu veux faire :
"Mettre en pause" je comprend "suspendre temporairement l'execution"
"Couper" je comprend "arreter l'enregistrement definitivement"

Peux tu préciser ?
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
14 févr. 2007 à 21:18
En fait, "permettre en quelque sorte a l'utilisateur des "couper" ses morceaux" etait un exemple de ce a quoi cette fonction pouvait me servire.
Donc la seule chose vraiment essentiel est "Mettre en pause" => "suspendre temporairement l'execution"

merci.
0