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

Visual C++ Discussion :

[CCom]Probleme avec SendMessage dans le thread


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut [CCom]Probleme avec SendMessage dans le thread
    Bonjour,

    J'utilise la classe de farscape que j'ai intégré dans une DLL. Je peux donc l'instancier à partir d'une autre application.

    Par contre, j'ai deux problèmes au niveau du thread avec SendMessage(), voici le code:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    //-----------------------------------------
    /*static*/ UINT CCommSerie::Thread(LPVOID pParam)
    {
    // 
        CCommSerie *pCom = (CCommSerie*)pParam;
        int nResult;
        DWORD WaitEvent = 0;
        DWORD dwError=0;
        DWORD dwMaskEvent=0;
        
    	//POUR ESSAI, A EFFACER
    	//pCom->m_pParent->SendMessage(WM_CCOMRCV,(WPARAM)pCom,dwMaskEvent);
    
        pCom->m_bThreadExist=true; // amorce l'existance du thread
        while(1)
        {
            nResult=pCom->WaitCommEvent(dwMaskEvent);
            if (!nResult)  
            { 
                switch(dwError=GetLastError()) 
                {             
                case 87:
                case ERROR_IO_PENDING:
                    break;
                    
                default:
                    {
                        // erreur de communication on fait suivre ...
                        pCom->GetError();
                        pCom->OnError(dwError);                    
                        break;
                    }
                }
            }
            else
            {
                if(pCom->IsRXEmpty()) continue;
            }
            // attente evenement pour sortie eventuelle du thread ou reception
            WaitEvent = WaitForMultipleObjects(2, pCom->m_hArrayEvent, FALSE, INFINITE);
            
            switch (WaitEvent)
            {
            case 0: //Fermeture Thread 
                       pCom->m_bThreadExist=false;
                       AfxEndThread(1);
                       return(0);
                
            case 1:dwMaskEvent=pCom->GetCommMask();
                        if(dwMaskEvent & EV_RXCHAR) // reception sur la voie.
                             pCom->m_pParent->SendMessage(WM_CCOMRCV,(WPARAM)pCom,dwMaskEvent);
                
                if ((dwMaskEvent & EV_CTS) ||  // evenements divers.
                    (dwMaskEvent & EV_RXFLAG) ||
                    (dwMaskEvent & EV_BREAK) ||
                    (dwMaskEvent & EV_ERR)
                    || (dwMaskEvent & EV_RING))
                {
                    pCom->m_pParent->SendMessage(WM_CCOMEVENT,(WPARAM)pCom,dwMaskEvent);
                }
                break;
            }
        };
        return 0;
    }
    Voici comment j'ai procédé:
    Afin de tester la gestion des événements, dès que je rentre dans le thread j'envoie l'événement WM_CCOMRCV à mon thread principal(appli utilisant la dll). Celui-ci déclenche juste une AfxMsgBox. Jusque là, pas de soucis!
    Par contre, une fois le message envoyé, je me retrouve avec un plantage (0xC0000005) sur la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nResult=pCom->WaitCommEvent(dwMaskEvent);
    Je ne l'explique pas...

    Pour continuer dans mes tests, je mets en commentaires l'envoie de l'événement précédent, et dans le thread principal, instanciant CCom, j'envoie des données sur la ligne série. Ligne série à laquelle j'ai connecté RX à TX au bout pour récupérer les infos émises.
    J'arrive donc à la ligne suivante dans le thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case 1:dwMaskEvent=pCom->GetCommMask();
                        if(dwMaskEvent & EV_RXCHAR) // reception sur la voie.
                             pCom->m_pParent->SendMessage(WM_CCOMRCV,(WPARAM)pCom,dwMaskEvent);
    mais cette fois ci, je reste bloqué sur cette fonction, étant donné qu'il me semble que le message n'est pas traité puisque aucun appel à la fonction associé au message n'est fait.
    Je ne comprends pas à nouveau pourquoi...Une idée?

    Merci

    Nicolas

  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
    Par défaut
    salut,
    comment tu démarres le thread (StartThread )
    l'argument est bien la fenêtre de traitement ?

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    En fait, ca marche apparemment très bien.

    Peut être que cela était dû au fait que je faisias du debug "pas à pas" dans le thread.

    Désolé

    J'y pense comme cela, pourquoi ne pas utiliser plutot PostMessage? Est il vraiment essentiel d'attendre qie le message soit traité?

    Bonne soirée

  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
    Par défaut
    Citation Envoyé par homeostasie
    En fait, ca marche apparemment très bien.

    Peut être que cela était dû au fait que je faisias du debug "pas à pas" dans le thread.

    Désolé

    J'y pense comme cela, pourquoi ne pas utiliser plutot PostMessage? Est il vraiment essentiel d'attendre qie le message soit traité?

    Bonne soirée
    ce n'est pas une obligation...

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bonjour,

    Je reviens sur l'un de mes messages. En effet, je compte maintenant utiliser la classe de farscape CCom sous forme de DLL dans mon projet.

    Lorsque je l'ai testé, j'avais créé une Classe dérivée de CDialog, j'avais passé à StartThread(), le pointeur this et je récupérais les caractères sur ma ligne lorsque je recevais un message privé WM_CCOMRCV. Ceci fonctionnait.

    J'aimerais utiliser de manière identique cette technique mais en évitant de passer par une classe dérivée de CDialog (qui impose de créer une boite de dialogue). De quelle classe pourrais je dériver afin de passer le bon argument à StartThread()?
    J'ai essayé en dérivant ma classe de CWnd mais je ne sais pas vraiment comment je dois m'y prendre...

    Si quelqu'un a été confronté à la même situation ou à une idée, je suis prenneur!

    Nicolas

  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
    Par défaut
    salut,
    tu fais une DLL d'extension et tu n'auras plus de probléme...

  7. #7
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par farscape
    salut,
    tu fais une DLL d'extension et tu n'auras plus de probléme...
    Par DLL d'extention, t'entends quoi? Modifier ta classe pour supporter mon cas de figure?

    Sinon, je m'y suis pris d'une autre manière. En gros, j'ai créé une classe dérivée de CDialog, j'utilse la fonction Create() pour créer ma boite de dialogue et je la cache.
    Ensuite je passe comme argument le CWnd correspondant à ma fenêtre.

    Nicolas

  8. #8
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bonjour,

    Concernant la classe CCom de Farscape disponible dans la FAQ, je n'arrive pas à utiliser les timeouts au travers la fonction de réglage SetTimeOuts (je ne sais plus trop le nom exactement...).

    En fait, je lance le thread de réception de données. A chaque donnée recue, le thread envoie un message à la fenetre parent. Je stocke au fur et à mesure les données dans une variable.
    Et j'aimerais que si au bout de 5 secondes je ne recois plus de données (réglage d'un timeout), alors un message de timeout est envoyé à la fenetre parent pour m'avertir et ainsi déclenché un événement pour poursuivre les opérations suivantes.

    Il ya t'il un moyen de faire cela via la classe CCom? (je le pense... ;-) ) Comment s'y prendre?

    Merci.

    Bonne journée
    Nicolas

Discussions similaires

  1. Probleme avec print dans un fichier
    Par goblin dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2005, 18h15
  2. Probleme avec guillemets dans commande HREF
    Par angelevil dans le forum ASP
    Réponses: 4
    Dernier message: 02/05/2005, 19h06
  3. [ADO.NET] Problème avec Insert dans base de données
    Par mpascolo dans le forum Accès aux données
    Réponses: 9
    Dernier message: 24/01/2005, 09h36
  4. [C#] Probleme avec TextBox dans un DataGrid
    Par Oberown dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/12/2004, 16h05
  5. [langage] Probleme avec caractère '$' dans script Perl
    Par zouetchou dans le forum Langage
    Réponses: 11
    Dernier message: 24/07/2004, 15h35

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