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

C# Discussion :

[Threads] L'appel à Thread.Abort coupe l'appli


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 44
    Points
    44
    Par défaut [Threads] L'appel à Thread.Abort coupe l'appli
    Bonjour,

    Voici mon probleme, qui doit pourtant etre simple, mais je ne trouve pas la réponse :
    Je dev un appli C#, dans laquelle je créée et lance un thread indépendant, qui dialogue avec un materiel en BT.
    Ce dialogue est permanent, jusqu'à l'appui sur une touche (c'est la meme touche qui lance / arrete le thread en question). Or, quand je clique sur ce bouton pour l'arreter, il me coupe bien le thread (via Thread.Abort()), mais l'appli complete aussi.
    Est-ce normal ?

    Un bout de code, si ca peut aider :
    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
    47
    48
    49
    50
    51
    52
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            Thread ThreadCalcul;
     
            private void BTN_DebutValideMesure_Click(object sender, EventArgs e)
            {
                try
                {
                    if (ThreadCalcul.ThreadState == System.Threading.ThreadState.Running)
                    {
                        ThreadCalcul.Abort();
                    }
     
     
                    ThreadCalcul = new Thread(new ThreadStart(InterrogerBT));
                    ThreadCalcul.Start();
                }
                catch (Exception ex)
                {
                    GererErreur(ex, "BTN_DebutValideMesure_Click", true);
                }
            }
     
     
            private void InterrogerBT()
            {
                try
                {
                    SerialPort sp = new SerialPort("com3");
                    sp.Open();
                    while (Thread.CurrentThread.IsAlive)
                    {
                        sp.WriteLine("gi");
                        string sBack = "";
                        sBack = sp.ReadLine();
                        GererErreur(new Exception("Retour : " + sBack));
                    }
                    sp.Close();
                }
                catch (ThreadAbortException Tex)
                {
                }
                catch (Exception ex)
                {
                    GererErreur(ex, "InterrogerBT");
                }
            }
        }
    }
    Une idée ?
    Merci !
    Olif.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Hello,
    Non, ça ne me semble pas être un comportement, seul le thread sur lequel tu fais "Abort()" devrait s'arrêter.

    Il y a peut-être une faille dans ta méthode BTN_DebutValideMesure_Click(): tu n'attends pas que le thread soit effectivement stoppé avant de le recréer. La doc de MSDN suggère qu'après un Abort(), tu devrais peut-être faire un Join() pour t'assurer que le thread se termine.

    Par ailleurs, je ferais aussi une modification dans ta méthode InterrogerBT(), car tu ne fermes pas correctement ton port com: lorsque tu fais un Abort() sur le thread, tu zappes la ligne "sp.Close();". Et il y a fort à parier que tu ne puisses pas réouvrir ton port com si tu ne l'as pas fermé auparavant. Ton "sp.Close();" devrait se trouver dans une clause "finally".

    Bye!

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    N'utilise pas Abort pour interrompre le thread, c'est déconseillé. Utilise plutôt un flag (variable bool) pour indiquer si la boucle doit continuer, ou un méchanisme genre WaitHandle.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Voici mon probleme, qui doit pourtant etre simple, mais je ne trouve pas la réponse
    En multithread, ca n'est JAMAIS simple

    Comme le disent les autres, évite les Abort et Interrupt

    Fais une boucle avec un bool en condition (place un petit Thread.Sleep(nMillisecondes) pour laisser respirer le CPU)

    Sinon tu aura des exceptions.

    Mais bon pour en revenir à ton problème "appli qui se ferme", sans message d'erreur si j'ai bien compris ; je dirai "au pif" que ton thread appel du code non managé. Et je devinne (toujours "au pif") que ton code non managé fait quelque chose de mal : un access violation, un bloc mémoire mal libéré. Qui crée une erreur suffisement violente pour que ca te ferme l'appli sans te lever d'exception.

    Tu peux regarder dans l'observateur d'evenement, tu auras peut etre des indices.

Discussions similaires

  1. [Thread] arrêter un thread contenant un appel blocant
    Par big.fares dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 11/10/2012, 13h52
  2. Perl, threads et appels system
    Par tnarol dans le forum Langage
    Réponses: 6
    Dernier message: 15/09/2010, 21h31
  3. Arrêt de Thread avec appel bloquant..
    Par dIwAmIb dans le forum C#
    Réponses: 5
    Dernier message: 22/04/2009, 11h44
  4. Erreur Thread sur Appel dans DLL
    Par Danyel dans le forum VB.NET
    Réponses: 10
    Dernier message: 27/10/2008, 23h57
  5. Questions sur méthodes d'un objet appelant threads
    Par med365 dans le forum Général Python
    Réponses: 8
    Dernier message: 26/06/2008, 15h14

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