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++

  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