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); };Le thread utilisé
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) { }
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(); };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 #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; }
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.
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; }
Merci
Ambroise
PS est il possible de déplacer cette demande dans le forum MFC dédié ?
Merci
Partager