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 :

Instanciation d'IHM depuis une console MFC


Sujet :

MFC

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 27
    Points : 47
    Points
    47
    Par défaut Instanciation d'IHM depuis une console MFC
    Bonjour à tous,

    Dans le cadre de TDD et BDD sur une application avec une IHM, nous souhaiterions tester la dite partie IHM.
    Cette application est en C++ utilisant les MFC de visual studio 2005.
    Nous utilisons gmock, gtest et cucumber-cpp, mais la n'est pas le problème.

    Pour tenter de tester nous avons crée une application console MFC qui embarque le code que nous voulons tester. Nous avons réussi à créer une fois l'IHM, à la détruire, mais impossible de la recréer pour le test suivant.

    J'ai fait un programme de test simple qui fait la même manipulation et j'ai toujours un crash lors de la deuxième tentative de création.

    Je pense (c'est même sur) que je fais un truc interdit mais je ne comprends pas la logique IHM.

    Si vous aviez un avis.

    Voici le code simple comme chou.

    La frame
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #pragma once
     
    class MainFrame : public CMDIFrameWnd
    {
    public:
    	MainFrame(void);
    public:
    	~MainFrame(void);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "StdAfx.h"
    #include "MainFrame.h"
     
    MainFrame::MainFrame(void)
    {
    }
     
    MainFrame::~MainFrame(void)
    {
    }
    Le thread utilisé
    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
     
    #pragma once
     
    #include "afxwin.h"
     
    class MyThread : public CWinThread
    {
    	DECLARE_DYNCREATE(MyThread)
    public:
    	MyThread(void);
    public:
    	~MyThread(void);
     
    	virtual BOOL InitInstance( );
    	virtual INT ExitInstance();
    };
    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
     
    #include "StdAfx.h"
    #include "MyThread.h"
    #include "MainFrame.h"
    #include "resource.h"
     
    IMPLEMENT_DYNCREATE( MyThread, CWinThread )
     
    MyThread::MyThread(void)
    {
    }
     
    MyThread::~MyThread(void)
    {
    }
     
    BOOL MyThread::InitInstance()
    {
    	MainFrame* mainFrame = new MainFrame();
    	mainFrame->LoadFrame(IDR_MENU1);
    	AfxGetApp()->m_pMainWnd = mainFrame;
    	mainFrame->ShowWindow(SW_SHOW);
    	return TRUE;
    }
     
    INT MyThread::ExitInstance()
    {
    	AfxGetApp()->m_pMainWnd->DestroyWindow();
    	return 0;
    }
    Le tout en action
    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
     
    // Test_MFC_Console.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include "Test_MFC_Console.h"
    #include "MainFrame.h"
    #include "MyThread.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
     
    // Seul et unique objet application
     
    CWinApp theApp;
     
    using namespace std;
     
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
     
    	// Initialise MFC et affiche un message d'erreur en cas d'échec
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    	{
    		// TODO*: modifiez le code d'erreur selon les besoins
    		_tprintf(_T("Erreur irrécupérable*: l'initialisation MFC a échoué\n"));
    		nRetCode = 1;
    	}
    	else
    	{
    		MyThread *pThread = (MyThread *)AfxBeginThread(RUNTIME_CLASS(MyThread));
     
    		Sleep(5000);
    		pThread->PostThreadMessage(WM_QUIT,0, 0);
    		// TODO*: codez le comportement de l'application à cet emplacement.
     
    		MyThread *pThread2 = (MyThread *)AfxBeginThread(RUNTIME_CLASS(MyThread));
     
    		Sleep(5000);
     
    		pThread2->PostThreadMessage(WM_QUIT,0, 0);
    	}
     
    	return nRetCode;
    }
    Mon crash se situe pendant le deuxième AfxBeginThread. J'ai aussi essayé en gardant le même objet pThread mais cela ne change rien.

    Merci

    Ambroise

    PS est il possible de déplacer cette demande dans le forum MFC dédié ?
    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 166
    Points : 12 284
    Points
    12 284
    Par défaut
    GG, déjà que vous ayez réussi à instancier les MFC depuis un main console sans que cela ne plante direct, j'aurais même pas osé.

    Les MFC plus Tests Unitaires ça fait au moins 48, au bas mot.

    Trèves de plaisanterie, les MFC utilisent tout un arsenal de truc et de bidule hautement incompatible avec les tests unitaires, comme des hook de fenêtre et autre pompes à messages custom.

    Moi, si j'avais un truc pareil à faire, je lancerais l'application avec une configuration adaptées aux tests et je ferais du pilotage de l'application depuis l'extérieur (automation ou génération d'évènement clavier et souris).

    Si des personnes connaissent un Framework adapté aux TU sur MFC, je suis tout ouïe, mais clairement, ce n'est pas une sinécure.

Discussions similaires

  1. [Tomcat6]Administrer les datasources depuis une console
    Par woodwai dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 28/04/2011, 13h19
  2. Utiliser MATLAB depuis une console (shell)
    Par ricololo dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/03/2009, 11h09
  3. Réponses: 12
    Dernier message: 19/06/2007, 10h24
  4. Réponses: 4
    Dernier message: 08/03/2006, 19h07
  5. Réponses: 1
    Dernier message: 02/02/2006, 14h26

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