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 :

EndDialog => plantage de l'application


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut EndDialog => plantage de l'application
    Bonjour,

    J'ai une application, qui, lors de la l'appui sur un bouton, ouvre une CDialog modale.

    Cette CDialog contient un GIF animé et un thread qui va fermer automatiquement la fenêtre après un certain temps. C'est tout.

    Hors, je m'aperçois que, à des fréquences variées, lorsque la boite de dialogue se ferme, c'est toute l'application qui plante...mais pas forcement du premier coup.

    En analysant le fichier user.dmp généré par Dr Watson, il semble s'arrêter sur la fonction CDialog::EndDialog (mais je ne sais pas trop comment bien analyser le user.dmp).

    Ci dessous mon code..(le GIF animé utilise la classe CPictureEx) :

    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
    67
    68
    69
    70
    71
    72
    73
    74
     
    // D_UsbPanel.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "D_UsbPanel.h"
     
     
    // Boîte de dialogue D_UsbPanel
     
    IMPLEMENT_DYNAMIC(D_UsbPanel, CDialog)
     
    D_UsbPanel::D_UsbPanel(CWnd* pParent /*=NULL*/)
    	: CDialog(D_UsbPanel::IDD, pParent)
    {
     
    }
    BOOL D_UsbPanel::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	int posX = m_resX-470; //m_resX : var globale resolution en X
    	int posY =m_resY-470; //m_resY : var globale resolution en Y
     
    //Chargement du GIF animé
    	if (usb_gif.Load(MAKEINTRESOURCE(IDR_USBHELP),_T("GIF")))
    	    usb_gif.Draw();
            usb_gif.SetWindowPos(&wndBottom,0,0,400,400,SWP_SHOWWINDOW);
     
    	MoveWindow(posX,posY,400,400);
     
    //Démarrge du décompte avant fermeture
    	AfxBeginThread(closingThread, this);
     
    	return TRUE;
    }
     
    D_UsbPanel::~D_UsbPanel()
    {
    }
     
    void D_UsbPanel::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_USBGIF, usb_gif);
    }
     
    //Fermeture de la fenetre, renvoi IDOK
    void D_UsbPanel::Close()
    {
    EndDialog(IDOK);
    }
     
     
    BEGIN_MESSAGE_MAP(D_UsbPanel, CDialog)
    END_MESSAGE_MAP()
     
     
    // Gestionnaires de messages de D_UsbPanel
     
     
    UINT closingThread(LPVOID pvParam)
    {
    	//AfxMessageBox(_T("Je suis dans le thread..."));
    	D_UsbPanel  *pThis=(D_UsbPanel *) pvParam ;
     
        //Pause de 3.6secondes
    	Sleep(3600); 
     
    	pThis->Close();
    	//AfxEndThread( 0 );
     
    	return 0;
    }
    Quelqu'un voit-il une erreur la dedans ?

    Merci,

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Information complémentaire :
    Si je n'appelle pas le thread, mais que j'affiche la barre de titre, je peux ouvrir et fermer la pop-up autant de fois que je le veux sans faire planter l'application...

    Il semble bien que ce soit la fermeture de la fenêtre depuis le thread qui pose problème...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Bon..il semblerait que j'ai trouvé...

    En fait, le problème viens du fait qu'il n'est pas très adapté de lancer un thread externe pour fermer ma fenêtre... on a vite fait d'avoir une erreur de pointeur...

    L'idéal est en fait d'utiliser la propriété OnTimer() des CDialog..

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    // D_UsbPanel.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "D_UsbPanel.h"
     
     
    // Boîte de dialogue D_UsbPanel
     
    IMPLEMENT_DYNAMIC(D_UsbPanel, CDialog)
     
    D_UsbPanel::D_UsbPanel(CWnd* pParent /*=NULL*/)
    	: CDialog(D_UsbPanel::IDD, pParent)
    {
     
    }
    BOOL D_UsbPanel::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	int posX = m_resX-470;
    	int posY = m_resY-470; 
     
    	if (usb_gif.Load(MAKEINTRESOURCE(IDR_USBHELP),_T("GIF")))
          usb_gif.Draw();
        usb_gif.SetWindowPos(&wndBottom,0,0,400,400,SWP_SHOWWINDOW);
     
    	MoveWindow(posX,posY,400,400);
     
    	KillTimer(1);
        SetTimer(1,3600,0); //Timer tous les 3600ms
     
    	return TRUE;
    }
     
    D_UsbPanel::~D_UsbPanel()
    {
    }
     
    void D_UsbPanel::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_USBGIF, usb_gif);
    }
     
    void D_UsbPanel::Close()
    {
    EndDialog(IDCANCEL);
    return;
    }
     
     
    BEGIN_MESSAGE_MAP(D_UsbPanel, CDialog)
    	ON_WM_TIMER()
    	ON_STN_CLICKED(IDC_USBGIF, &D_UsbPanel::OnStnClickedUsbgif)
    END_MESSAGE_MAP()
     
     
    // Gestionnaires de messages de D_UsbPanel
     
     
     
    void D_UsbPanel::OnStnClickedUsbgif()
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
    Close();
    }
     
     
    void D_UsbPanel::OnTimer(UINT nIDEvent)
    {
    	if (nIDEvent == 1)
    	{	
    		EndDialog(IDCANCEL);
    	}
    	CDialog::OnTimer(nIDEvent);
    }
    maintenant plus de Access Violation ..

Discussions similaires

  1. PLantage d'une application lié à son nom
    Par samworld dans le forum Windows XP
    Réponses: 4
    Dernier message: 16/01/2009, 19h31
  2. Plantage d'une application CWinApp traitement particuliers
    Par Aradesh dans le forum Visual C++
    Réponses: 12
    Dernier message: 07/04/2008, 11h39
  3. instruction SaveAs : plantage de l'application lorsque le fichier est créé
    Par Aimé_Lacapelle dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/08/2007, 19h43
  4. Réponses: 2
    Dernier message: 31/01/2007, 09h57
  5. plantage éditions PDF (application ASP)
    Par dev-man dans le forum ASP
    Réponses: 3
    Dernier message: 13/02/2006, 18h59

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