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 :

Ca marche en Debug, ca plante en Release


Sujet :

MFC

  1. #1
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut Ca marche en Debug, ca plante en Release
    Salut,

    Voici le contexte : depuis un thread exécuté à partir d'un CProcessDlg (modal) je poste un message dans ce même CProcessDlg pour commander l'affichage d'un CAskUserDlg (modal).

    CProcessDlg et CAskUseDlg sont dérivés de CDialog.

    voici le code dans CProcessDlg permettant d'afficher le CAskUserDlg :

    void CProcessDlg::askUser(WPARAM, LPARAM lParam)
    {
    m_askUserText = *reinterpret_cast<CString*>(lParam);

    CAskUserDlg dialog;
    dialog.setText(m_askUserText);
    dialog.DoModal();
    }
    Tout fonctionne très bien en mode DEBUG. En mode RELEASE ca se gate...

    En mode RELEASE :
    Le CAskUserDlg s'affiche correctement (celui ci contient un CStatic, une CProgressbar et 2 CButton).
    Mais dès que je passe ma souris soit sur la CProgressbar soit sur l'un des CButton l'application plante.

    The memory could not be read

    Je comprends rien, pourquoi ca marche en DEBUG, pourquoi ca marche pas en RELEASE...


  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
    le message qui genere askUser c'est quoi posmessage ou sendmessage ?


  3. #3
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    C'est PostMessage.

    Je viens d'essayer avec SendMessage... mais ca change rien.

    Je pensais aussi au début que l'erreur provenais du "postage" de message... mais je ne pense plus. Le texte que je poste apparait correctement dans tout les cas.

    L'erreur se produit vraiment seulement quand je passe la souris sur un des boutons ou sur la progressbar.


    voila tout le contexte si ca peut aider :

    Dans le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CDialogCommand::execute()
    {
      ::PostMessage(*m_pvParam,m_msg,0,(LPARAM)&m_text) ;
      AfxGetThread()->SuspendThread();
    }
    Hors du thread :


    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
    void CProcessDlg::askUser(WPARAM, LPARAM lParam)
    {
     
    	m_askUserText = *reinterpret_cast<CString*>(lParam);
     
    	CAskUserDlg dialog;
    	dialog.setText(m_askUserText);
    	int i = dialog.DoModal();
     
    	if(i==1)
    	{
    		m_pThread->ResumeThread();
    	}
                    else
                    {
                                   TerminateThread(m_pThread,0);
                    }
     
    }

  4. #4
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Tu es certain de ne pas avoir de code conditionnel au mode débug qui devarait aussi apparaître en mode Release?

  5. #5
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    Perso, je n'ai ajouté aucune ligne de code conditionnelle DEBUG/RELEASE.

    La seul chose qu'on peut trouver c'est ce que Visual C++ ajoute tout seul dans chaque fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    ...

    désespérant...

  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,
    dialog.setText(m_askUserText);
    int i = dialog.DoModal();
    j'espere que setText ne fais pas de traitement graphique ?

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    C'est aussi souvent un problème de variables non initialisées, en mode debug le compilo les initialise gentiment, mais pas en mode release.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    Non ne t'inquiètes pas (j'avoue j'ai failli me faire avoir... )

    Voila ce que fait setText
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void CAskUserDlg::setText(CString text)
    {
       m_text = text;    // m_text est un CString
    }
    Un CStatic prendra la valeur de m_text dans OnInitDialog...


    Je viens de trouver ca :
    Visual C++ 6 - Release builds crash but Debug build do not crash

    ce qui est dit, c'est qu'en général, quand ca marche en debug et pas en release, c'est qu'il y a un problème avec les messagemap.

    Vu que j'utilise des messages également, je pense que mon erreur peu venir de la... seulement je vois pas trop où est mon erreur (si il y en a une à ce niveau)

    Ma message map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN_MESSAGE_MAP(CProcessDlg, CDialog)
    	//{{AFX_MSG_MAP(CProcessDlg)
    	//}}AFX_MSG_MAP
    ON_THREAD_MESSAGE(WM_ASK_USER,askUser)
    ON_THREAD_MESSAGE(WM_EDIT_EMAIL,editEmail)
    END_MESSAGE_MAP()
    la déclaration de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void CProcessDlg::askUser(WPARAM wParam, LPARAM lParam)
    {
    ...
    }

  9. #9
    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
    hum ce qui me plait pas trop c'est ton utilisation de ON_THREAD_MESSAGE
    pour une dialogue ...
    cette macros s'utilise avec une classe CWinThread .
    remplace la par ON_MESSAGE.
    voir ce post pour les messages prives :
    http://www.developpez.net/forums/vie...567222#1567222

  10. #10
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    Je viens de remplaer ON_THREAD_MESSAGE par ON_MESSAGE...
    ca fait toujours la même chose que tout à l'heure.
    Ca plante en release, quand je passe au dessus d'un bouton, ou progressbar...

  11. #11
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    J'ai trouvé d'où vient le plantage (mais je sais toujours pas pourquoi).

    Dans CAskUserDlg j'avais mis en place un timer qui faisait avancer la progessbar.

    Si je vire tout ce qui est relatif à ce timer, ca ne plante plus en release...
    mais pourquoi ca plante ???

    dans le fichier .hpp
    dans le fichier .cpp
    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
     
    BEGIN_MESSAGE_MAP(CAskUserDlg, CDialog)
    //{{AFX_MSG_MAP(CAskUserDlg)
    ON_BN_CLICKED(IDSTOP, OnStop)
    ON_BN_CLICKED(IDWEITER, OnWeiter)
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_TIMER,onTimer)
    END_MESSAGE_MAP()
     
    BOOL CAskUserDlg::OnInitDialog() 
    {
     ... 
     m_timer = SetTimer(1,1000,0);
     ...	
    return TRUE;  
    }
     
     
    void CAskUserDlg::onTimer(UINT nIDEvent)
    {
        switch(nIDEvent)
        {
            case 1:updateProgressBar();  
            default:break;
        }    
        // Call base class handler.
        CDialog::OnTimer(nIDEvent);
    }*/
    : : :

  12. #12
    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
    tu as le droit d'avoir un timer ,
    c'esr peut etre ta fonction updateProgressBar() qui met le bazare.

  13. #13
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    j'ai testé avec une fonction OnTimer qui fait rien du tout... le plantage à lieu...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CAskUserDlg::OnTimer(UINT nIDEvent)
    {
     
     
     
    }

Discussions similaires

  1. fwrite() fonctionne en Debug et plante en release
    Par fleurdelys77 dans le forum C++/CLI
    Réponses: 3
    Dernier message: 18/08/2011, 10h39
  2. Réponses: 13
    Dernier message: 22/10/2010, 23h26
  3. Erreur de link en Debug et pas en Release
    Par vanitom dans le forum Visual C++
    Réponses: 2
    Dernier message: 23/04/2009, 16h40
  4. Fonctionne en Debug mais pas en Release
    Par Baud10 dans le forum MFC
    Réponses: 23
    Dernier message: 04/02/2008, 15h17
  5. regsvr32 failed en debug mais pas en release
    Par afan dans le forum DirectX
    Réponses: 1
    Dernier message: 09/06/2004, 10h32

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