IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

arret et reprise d'un thread


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut arret et reprise d'un thread
    Bonjour,

    je suis confronté à un probleme que je n'arrive pas à resoudre.
    Je lance un thread qui fais un long traitement qui crée des fichiers et ecrit dedans.
    J'arrete le thread en appelant dessus la methode abort(), pas de probleme le thread s'arrete.
    Le probleme se pose lorsque je relance le thread, j'ai alors une IO exception, qui me dis que le fichier est utilisé par un autre process.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // demarrage et relance du thread
    PgbThread = new Thread(new ThreadStart(Treatment));
                    PgbThread.IsBackground = true;
                    PgbThread.Start();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // arret du thread
     PgbThread.Abort();

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    C'est normal...

    Si tu ouvres le fichier dans ton thread de traitement, Windows ( l'OS) te
    reserve un handle de fichier et lors du abort sur ton thread, si tu n'as pas
    "fermer" correctement ton fichier (File.Close par exemple) , l'application
    va garder le handle sur le fichier et tu auras du mal à écrire dedans par la suite

    donc, en regle general, faire un abort sur un thread nécéssite que le thread
    se "ferme" correctement si possible

    The Monz, toulouse

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    Citation Envoyé par theMonz31
    donc, en regle general, faire un abort sur un thread nécéssite que le thread
    se "ferme" correctement si possible

    The Monz, toulouse
    c'est a dire ?

  4. #4
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    C'est à dire que ton fichier il est encore ouvert.
    Donc forcément, tu peux pas bosser dessus paske t'as killé ton thread comme un gros crado

    "Mais comment on fait alors ?"
    Plutôt que de tuer salement un mec qui fait bien gentiment son travail, il suffit dans la boucle principal de ton thread de lui coller un boolean "continuer".
    Tant que le boolean est vrai, alors ton thread bosse.
    Quand tu mets le booléen à faux, ton thread sais qu'il doit s'arrêter, et là il exécutera le Close() qui va bien pour fermer ton fichier.

  5. #5
    Membre confirmé Avatar de dragohn
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 85
    Par défaut
    Bonjour,

    vaut il mieux utiliser votre solution Mose, ou passer par un bloc try/catch/finally et capturer l'exception ThreadAbortException pour fermer le fichier/finir le traitement.
    Ma question peut sembler de novice (je le suis), et je dois admettre que j'avais pensé à traiter ça que via l'exception... à faire ou éviter?

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    Citation Envoyé par dragohn
    Bonjour,

    vaut il mieux utiliser votre solution Mose, ou passer par un bloc try/catch/finally et capturer l'exception ThreadAbortException pour fermer le fichier/finir le traitement.
    Ma question peut sembler de novice (je le suis), et je dois admettre que j'avais pensé à traiter ça que via l'exception... à faire ou éviter?
    j'ai egalement essayé de fermer le fichier dans le bloc ThreadAbortException mais ca ne donne rien.

  7. #7
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Citation Envoyé par dragohn
    Bonjour,

    vaut il mieux utiliser votre solution Mose, ou passer par un bloc try/catch/finally et capturer l'exception ThreadAbortException pour fermer le fichier/finir le traitement.
    Ma question peut sembler de novice (je le suis), et je dois admettre que j'avais pensé à traiter ça que via l'exception... à faire ou éviter?
    L'exception c'est la solution barbare et un peu crade. qui plus est, en terme de perf c'est pas terrible : le runtime peut mettre une seconde ou deux avant de rendre la main.
    La solution du booléan est plus propre, et elle permet à ton thread de finir au moins le traitement qu'il était en train de faire.

    Ex : je copie n fichiers dans mon thread. A chaque fichier de vérifie mon booléen.
    Si je kill + exception : le ficher en cours de copie a-t-il été complètement copié / partiellement copié / pas du tout copié ? On n'en sait rien
    alors qu'avec la solution booléan, le traitement s'interromp après la copie complète d'une fichier

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    Citation Envoyé par Mose
    C'est à dire que ton fichier il est encore ouvert.
    Donc forcément, tu peux pas bosser dessus paske t'as killé ton thread comme un gros crado

    "Mais comment on fait alors ?"
    Plutôt que de tuer salement un mec qui fait bien gentiment son travail, il suffit dans la boucle principal de ton thread de lui coller un boolean "continuer".
    Tant que le boolean est vrai, alors ton thread bosse.
    Quand tu mets le booléen à faux, ton thread sais qu'il doit s'arrêter, et là il exécutera le Close() qui va bien pour fermer ton fichier.
    j'ai essayé cette technique mais le probleme est que le thread est arreté à la premiere rentrée dans la boucle, il n'a donc pas acces à l'etat du booleen.
    Comme ca :
    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
    while (termine == false){
     
           //.... traitement
          // 1ere boucle for
          for (...){
     
     
          }
     
           //.... traitement
          // 2e boucle for
          for (...){             // <--- si le thread s'arrete ici l'etat termine n'a pas changé
     
     
          }
     
     
          //.... traitement
          // 3e boucle for
          for (...){
     
     
          }
     
     
     
    }
    Je pourrais verifier l'etat de "termine" avant chaque instruction mais le traitement fais des centaines de lignes, je ne me vois pas faire ca 700 fois !!

    Si quelq'un a une astuce je suis preneur

  9. #9
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Citation Envoyé par voyageur
    j'ai essayé cette technique mais le probleme est que le thread est arreté à la premiere rentrée dans la boucle, il n'a donc pas acces à l'etat du booleen.
    Quand tu me dit "le thread s'arrête ici", j'ai un peu de mal à comprendre.. qui l'arrête ?

    Je me suis sans doute mal exprimé.
    En fait, pour arrêter ton thread, tu n'a qu'une seule chose à faire : mettre le booléan terminé à vrai.

    Ensuite, il ne s'agit pas de créer une boucle spécialement pour ça. Je partais du principe que ton thread fonctionnait déjà avec une boucle. Dans ton exemple, il s'agit de tes boucles for.

    Dans chacune de ces boucles, tu rajoutes la condition d'arrêt !termine (ça retourne déjà un booléan, pas la peine de faire termine == false)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 0; (i < max) && !termine; i++)
    {...}
    Citation Envoyé par voyageur
    Je pourrais verifier l'etat de "termine" avant chaque instruction mais le traitement fais des centaines de lignes, je ne me vois pas faire ca 700 fois !!
    En fait, tu peux ne faire ça qu'à certaines étapes clef.
    Par exemple, avant tous les traitements longs.

Discussions similaires

  1. arreter l'execution d'un thread en java
    Par albokos dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/05/2008, 03h13
  2. interruption et reprise d'un thread
    Par Virgile le chat dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 09/07/2007, 13h28
  3. Interruption et reprise d'un Thread
    Par michaeljeru dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 12/04/2007, 18h17
  4. Interruption et reprise d'un Thread
    Par Nuro dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 28/02/2007, 21h34
  5. Pause et reprise d'un thread
    Par raggadoll dans le forum Linux
    Réponses: 5
    Dernier message: 03/07/2003, 20h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo