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

MFC Discussion :

[MFC] Problème d'arrêt du thread avec CCom de Farscape


Sujet :

MFC

  1. #1
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut [MFC] Problème d'arrêt du thread avec CCom de Farscape
    Bonjour à tous,

    je n'arrive pas à fermer le port à la fin d'une communication série (en fait un Virtual Com Port, pour un périphérique USB) :


    j'ai (légèrement) modifié une partie de la procédure CCom:: PortClose(), ce qui donne ça :
    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
     
    //-----------------------------------------
    bool CCom::PortClose()
    {
        //
     
     
    	if(!m_hCom) return false;
        PurgeCom();
     
     
        if(m_pThread) // fermeture thread
        {
     	    TRACE("Le Thread tente de s'arrêter");
           do
            {
                if (!SetEvent(m_hCloseCom)) TRACE("Erreur: %d",GetLastError() );
            }
            while(m_bThreadExist);
    	    TRACE("Le Thread s'arrête");
     
            CloseHandle(m_hCloseCom);
        }
        if(m_Ov.hEvent) CloseHandle(m_Ov.hEvent);
        m_Ov.hEvent=NULL;
        m_hCloseCom=NULL;
        m_pThread=NULL;
     
    //    EscapeCommFunction( m_hCom, CLRDTR );
        EscapeCommFunction( m_hCom, CLRRTS );
     
        int status= CloseHandle( m_hCom);   
        m_hCom=NULL;
        if ( status ) return true;
        GetError();
        return false;
    }
    j'appelle maCom.PortClose(); pour fermer le port, et dans DebugView, j'obtiens uniquement:

    [3980] Le Thread tente de s'arrêter

    puis ma boite de dialogue se bloque !!

    j'en déduis donc que :
    1. m_bThreadExist ne vaut jamais NULL, donc la boucle est infinie
    2. il n'y a pourtant pas d'erreur dans SetEvent car je n'ai pas d'affichage d'un code d'erreur

    Farscape, pourrais-tu m'expliquer ce qui se passe ?

    Merci beaucoup d'avance
    Philippe

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    bonsoir,
    hum tu ne ferais pas la fermeture du port dans une fonction appellée par un message du thread ?

  3. #3
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Bonsoir Farscape,

    non, je ferme le port lors d'un clic sur un bouton du genre "Arrêter la transmission"

    j'envoie un ordre au périphérique pour qu'il arrête de lui-même l'envoi de données vers le PC,
    puis je fais une tempo de 1 seconde,
    puis seulement je tente de fermer le port

    peut pas dire que j'brutalise l'matériel avec autant de précautions

    Philippe

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    bizarre,
    avant de cliquer sur sur le bouton met un point d'arret sur l'appel de WaitForMultipleObjects dans le thread .
    ou plutôt juste aprés .
    ça sort de l'attente apres le SetEvent?

  5. #5
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    j'ai mis un TRACE avant et après WaitEvent, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            // attente evenement pour sortie eventuelle du thread ou reception
    		TRACE("Avant WaitEvent");
            WaitEvent = WaitForMultipleObjects(2, pCom->m_hArrayEvent, FALSE, INFINITE);		
     		TRACE("WaitEvent %d",WaitEvent);
    pendant la transmission, j'obtiens :

    Avant WaitEvent
    WaitEvent 1

    (en continu bien-sûr)
    puis lors de la tentative d'arrêt, je n'ai pas 0 comme valeur,
    mais je reste sur le message

    Le Thread tente de s'arrêter
    (provenant de PortClose)

    cela est-il clair ?

    Philippe

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    le WaitForMultipleObjects doit s'arreter sur le setevent c'est obligé,
    si c'est pas le cas je ne vois qu'une explication possible:
    le thread envoie un sendmessage à la fenetre mais celle -ci ne lui rend pas la main .
    c'est possible ?

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    le probleme doit venir de la si tu tentes d'arreter en cours de conversation.
    ininterrompue de la part du péripherique ...
    c'est le cas ?

  8. #8
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut


    bon, tu as raison, fermer le port lors d'une conversation ininterrompue n'était pas très satisfaisant !
    c'est pour ça que je faisais une tempo d'une seconde avant de fermer le port.
    Mais c'était visiblement trop court encore :

    j'ai mis un bouton pour stopper la conversation, et un autre pour fermer le port:
    je prend mon temps pour cliquer sur l'un, puis l'autre, et là

    CA MARCHE à tous les coups !

    Encore bien vu Farscape
    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 11/06/2015, 15h51
  2. Problème de gestion de Thread avec un TableRowSorter
    Par stef8383 dans le forum EDT/SwingWorker
    Réponses: 2
    Dernier message: 16/12/2013, 18h30
  3. Problème d'arrêt de Thread
    Par raspac dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 15/05/2009, 11h38
  4. Arrêt de Thread avec appel bloquant..
    Par dIwAmIb dans le forum C#
    Réponses: 5
    Dernier message: 22/04/2009, 11h44
  5. Réponses: 5
    Dernier message: 10/05/2005, 10h22

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