J'ai besoin dans mon programme principal d'ouvrir à un moment donné une PopUp qui reste affiché le temps de faire une opération bien précise. (Un test de connexion à un serveur, la popup restera affichée tant que la connexion n'est pas bonne).

Pour cela, j'ai suivi votre tutoriel "Comment créer un thread de travail" (http://cpp.developpez.com/faq/vc/?pa...keWorkerThread) avec AfxBeginThread...

Le probleme, c'est ma fonction de thread semble ne jamais se lancer...

Mon code :
D_TestConn.h
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
 
#pragma once
 
#include "Controls/statictrans.h"
#include "controls/TransparentStatic.h"
#include "controls/GradientProgressCtrl.h"
#include "Controls/xSkinButton.h"
#include "controls/PictureEx.h"
 
//Inclusion de la classe permettant de faire les tests de connexion..pour l'instant, on s'en occupe pas...
#include "TestPing.h"
 
 
 
#pragma managed //Car mon TestPing.h est une "ref class" 
 
class CD_TestConn : public CDialog
{
public:
 
// Dialog Data
	enum { IDD = IDD_TESTCONN };
 
	//Données
	CString						Message;
 
	//Composants
	CPictureEx					m_picture;
	CxSkinButton				m_picture2;
	CTransparentStatic			m_st_l1;
	CTransparentStatic			m_st_l2;
 
 
	//Fonction Automatique
	CD_TestConn(CWnd* pParent = NULL);   // standard constructor
	virtual ~CD_TestConn();
	virtual BOOL				OnInitDialog();
	afx_msg void				OnCancel();
	afx_msg void				OnPaint();
	virtual BOOL				PreTranslateMessage(MSG* pMsg);
	afx_msg int					OnCreate(LPCREATESTRUCT lpCreateStruct);
 
	//Fonction Perso
	bool InitThread();
	afx_msg void				OnBnClickedButton1();
	void						MajTimer(int timer);
 
protected:
	virtual void				DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	DECLARE_MESSAGE_MAP()
 
private :
	//Mon Thread
	static UINT	ConnectThread(LPVOID pvParam);
	CWinThread *m_pThread;
 
};
#pragma unmanaged
et mon .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
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
 
// D_TestConn.cpp : implementation file
//
 
#include "stdafx.h"
#include "Passshell.h"
#include "D_TestConn.h"
 
 
#pragma managed
 
/**************
* Constructeur
****************/
CD_TestConn::CD_TestConn(CWnd* pParent /*=NULL*/)
: CDialog(CD_TestConn::IDD, pParent)
{
	m_pThread = NULL;
}
 
/**************
* Destructeur
****************/
CD_TestConn::~CD_TestConn()
{
}
 
 
/**************
* Association des composants avec les controlleurs
****************/
void CD_TestConn::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LBL1,		m_st_l1);
	DDX_Control(pDX, IDC_LBL2,		m_st_l2);
	DDX_Control(pDX, IDC_PIC1,		m_picture);
	DDX_Control(pDX, IDC_BUTTON1,		m_picture2);
}
 
 
BEGIN_MESSAGE_MAP(CD_TestConn, CDialog)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDCANCEL, OnCancel)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_BUTTON1, &CD_TestConn::OnBnClickedButton1)
END_MESSAGE_MAP()
 
 
/**************
* Affichage
****************/
BOOL CD_TestConn::OnInitDialog()
{
	CDialog::OnInitDialog();
/**/
.
.
//Ici j'instancie mes coposant d'affichages...ca marche bien...
.
.
/**/
 
	return TRUE;
}
/************
* Réaffichage
**************/
void CD_TestConn::OnPaint()
{
	CPaintDC dc(this);
	m_st_l2.SetWindowText(this->Message); //Mise à jour d'un champ texte (à partir de this->Message cf. MajTimer() ) 
	m_st_l2.Invalidate();
	m_st_l1.Invalidate();
}
 
/**************
* Sur annulation...inutile
****************/
void CD_TestConn::OnCancel() { }
 
 
/**************
* A la création....
****************/
int CD_TestConn::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	return 0;
}
 
 
/**************
* Lancement du thread ??? (Ca marche ca ?  C'est meme pas déclaré).
****************/
bool CD_TestConn::InitThread()
{
	m_pThread = AfxBeginThread(ConnectThread, this,THREAD_PRIORITY_HIGHEST);
	if(!m_pThread)
	{
		AfxMessageBox(_T("Impossible de créer le thread !") );
		// Impossible de créer le thread !
		return false;
	}
	return true;              
}
 
 
/**************
* Mise à jour du champs texte 
****************/
void CD_TestConn::MajTimer(int timer)
{
	char * CTimer = new char [3];
	_itoa(timer,CTimer,10);
	this->Message = (_T("Nouveau test dans ")+CString(CTimer))+_T(" secondes");
	AfxMessageBox(_T("MESSAGE : ") + this->Message);
	RedrawWindow();
}
 
 
/**************
* Ca je ne sais pas à quoi ca sert...
****************/
BOOL CD_TestConn::PreTranslateMessage(MSG* pMsg)
{
	if (pMsg->message == WM_SYSCOMMAND && pMsg->wParam == SC_CLOSE)
		return TRUE;
	return CDialog::PreTranslateMessage(pMsg);
}
 
/****************
* Clic sur le bouton "redemmarrer"
******************/
void CD_TestConn::OnBnClickedButton1()
{
	//On reboote la machine
	if (!ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0))
		ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);
	DestroyWindow(); //La fenetre se termine.
}
 
 
/***********************
* Mon fameux Thread qui va tester les connection
**************************/
UINT CD_TestConn::ConnectThread(LPVOID pvParam)
{
	AfxMessageBox(_T("Je suis dans le thread..."));
	CD_TestConn  *pThis=reinterpret_cast< CD_TestConn *>( pvParam) ;
 
	int		nb_essai=0; 
	int		interval=10;
	bool	reboot=false;
	//TestPing ^ MyPinger = gcnew TestPing();
	while (1)
	{
		nb_essai++;
		// Ici on fait le test...mais pas pour l'instant
		/** /
                        ....
                /**/
 
		//Si nombre d'essai entre 1 et 3 , on attends 10 secondes entre chaque essai
		if(nb_essai <= 5) interval =10;
		//Si nombre d'essai entre 4 et 6 , on attends 30 secondes entre chaque essai
		if(nb_essai > 5 && nb_essai <= 10) interval =30;
		//Si nombre d'essai supérieur à 10  , on attends 5 minutes entre chaque essai
		if(nb_essai >10  ) interval =300;
		//Si nombre d'essai supérieur à 13 ... on atends que l'on redémarre la borne..
		if(nb_essai > 13 ) reboot=true;
 
		//Si on epuisé tout nos essais...on arrete..et on attends le reboot
		if (reboot==true)
		{
			pThis->OnBnClickedButton1();
			return 1;
			break;
 
		}
 
		//Je me pose pendant l'inteval
		for(int i=0; i< interval; i++)
		{
			//On affiche le temps avec le prochain essai : interval-i
			pThis->MajTimer(interval-i);
			Sleep(1000);
		}
 
	}
	return 0;
}
#pragma unmanaged
Donc, malgré les AfxMessageBox qui devraient s'afficher ou la fonction MajTImer() devrait modifier un libellé, rien ne se passe...
La popup s'ouvre bien...mais c'est tout....

Ou est ma bêtise ?