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 :

Problème d'envoi de message depuis "Worker Thread" => Main Frame


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 78
    Par défaut Problème d'envoi de message depuis "Worker Thread" => Main Frame
    Bonjour,

    Dans mon application MDI, j'ai un "Worker Thread" créé à l'aide de AfxBeginThread (dans InitInstance).

    Ce thread est prévu pour envoyer des message qui sont traités dans le MainFrm.

    Cependant, on observe un plantage. La méthode utilisée pour envoyer des messages est:

    PostMessage(AfxGetMainWnd()->m_hWnd,IDM_MY_MESSAGE,(WPARAM)NULL,(LPARAM)NULL);

    J'ai lu qq part sur le web que lorsque AfxGetMainWnd() était appelée dans un worker thread, la méthode retourne NULL.
    Par conséquent j'ai ajouté une variable membre au fichier principal (celui qui contient InitInstance), puis la variable est initialisée juste avant la sortie de InitInstance de sorte à sauvegarder un pointeur valide sur fenêtre principale:

    pMainWnd=AfxGetMainWnd();

    Puis dans le worker thread j'utilise:

    PostMessage(theApp.pMainWnd->m_hWnd,(WPARAM)NULL,(LPARAM)NULL);

    Cependant après toutes ces modifications, le résultat est le même.

    Nota: le problème n'apparaît qu'en mode Release....

    Merci de me venir en aide.

    Whitebird001

  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
    ce que tu exposes est incomplet ou incorrecte .
    ton postmessage dans le worker thread n'est pas bon, la signature de l'api 32:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BOOL PostMessage(   HWND hWnd,    UINT Msg,    WPARAM wParam,    LPARAM lParam  );
    ou est l'identifiant du message dans ton cas?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 78
    Par défaut
    Ah oui pardon, j'ai oublié dans le post de recopier le message mais il est bien présent dans mon code:

    Cela donne par conséquent:

    PostMessage(theApp.pMainWnd->m_hWnd,IDM_MY_MESSAGE,(WPARAM)NULL,(LPARAM)NULL);

  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
    note que a partir de la classe CWinApp tu avais accès a m_pMainWnd...
    a quel niveau s'effectue le plantage ?, quel est le message d'erreur ?
    tu peux utiliser OutputDebugString pour laisser des messages en release qui seront visibles avec l'utilitaire debugview.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 78
    Par défaut
    Le plantage s'effectue suite à la réception du message émis par le worker thread, dès lors qu'une opération graphique est exécutée.

    Ainsi si dans la méthode invoquée suite à la réception du message (et située dans MainFrm) je place simplement un return; il n'y a pas de plantage tant que je ne bouge pas la souris.

    Si par contre dans cette méthode je déclenche l'affichage d'une fenêtre avec pDoc->OnNewDocument(), le plantage apparaît au moment où la fenêtre est affichée.

    Donc en résumé: le plantage est lié à l'émission de message par le worker thread et/ou la récception du message dans MainFrm, mais apparaît lorsqu'une action graphique se produit.

    L'erreur générée est (j'ai un XP anglais): MyApplication has encountered a problem and needs to close. We are sorry for the inconvenience.

    Puis en bas envoyer/ne pas envoyer de rapport...

    Le détail du rapport indique entre autre:

    Exception Information
    Code: 0xc0000005 Flags:0x00000000
    Record: 0x0000000000000000 Address: 0x0000000000428C24

    Voilà j'espère que ce n'est pas trop confu.

    Whitebird001

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 78
    Par défaut
    J'ai générée une version Release mais avec des option de debugage si bien qu'il est possible de lancer l'appli dans le debugueur tout en conservant le plantage.

    Le message d'erreur affiché dans le output est:

    First-chance exception in RealTimePIC.exe: 0xC0000005: Access Violation

    Sauf erreur de ma part, la méthode incriminée est: IsWindowEnabled.

  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
    Par défaut
    salut,
    voir faq:
    http://cpp.developpez.com/faq/vc/?pa...gPointeurValue
    ton objet graphique n'est pas valide.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 78
    Par défaut
    OK merci pour le lien farscape.

    Après qq modifications de mon code j'ai constaté que parfois l'erreur apparaîssait dans la méthode AttachControlSite.

    J'ai alors lancé une recherche de cette méthode sous google ce qui m'a conduit vers le lien suivant:

    http://www.codeguru.com/forum/archiv.../t-109263.html

    Et effectivement, c'est bien la solution à mon problème.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 78
    Par défaut
    J'ai maintenant un petit souci de compilation:

    Lors du débugage, j'avais généré une version release mais avec des options pour permettre le lancement avec debugeur.

    Pour ce faire dans Project Settings, j'ai sous l'onglet C/C++ sélectionné:

    Debug Info => Program Database,

    puis sous Link, sélection de "Generate Debug Info"

    Hors maintenant pour revenir à du Release pur, j'ai retiré ces options.

    Le Pb c'est que j'obtiens lors de la compilation le message:

    vc60.pdb is not the pdb file that was used when this precompiled header was created, recreate the precompiled header.
    J'ai essayer un Clean puis rebuild all mais rien n'y fait...

    Qu'est ce donc encore que cette erreur?

Discussions similaires

  1. Problème d'envoie de message
    Par clout26 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 04/08/2008, 17h59
  2. [Forms]Envoi des messages depuis une interface Forms
    Par MOUELY Daniel dans le forum Forms
    Réponses: 1
    Dernier message: 26/04/2007, 11h59
  3. [Thread]Problème d'envoie de message
    Par homeostasie dans le forum MFC
    Réponses: 4
    Dernier message: 15/02/2007, 09h26
  4. [Outlook 2003] Problème d'envoie de message.
    Par bilb0t dans le forum Outlook
    Réponses: 12
    Dernier message: 18/05/2006, 11h45

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