Bonjour

Dans un appli dialog based j'ai une classe heritant d'une CSocket
Code : Sélectionner tout - Visualiser dans une fenêtre à part
class CClntSock : public CSocket
Cette classe derive la methode OnReceive afin de travailler avec des socket asynchrone

Code : Sélectionner tout - Visualiser dans une fenêtre à part
virtual void OnReceive(int nErrorCode);
Dans ma dialog j'ai besoin de plusieurs de ces classes donc dans le .h de la dialogue je declare n pointeurs vers cette classe.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
CClntSock *m_pClientSock[NB_MAX_CONTROLER];
Dans le initdialog je cree les nouveaux elements et je les initialise

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
for(i = 1; i <= Nb_Reader; i++) 
{
if ((m_pClientSock[i] = new CClntSock) != NULL)
{
if (m_pClientSock[i]->Create())
{
if (!m_pClientSock[1]->Connect(m_pClientSock[1]->m_IpAddress,m_pClientSock[1]->m_Portnum))
}
 
}
}
Si je n'est pas d'erreur tout va bien et je recoit comme je le veux par la méthode overide OnReceive

Par contre Je souhaite que ce traitement ce fasse dans n different thread afin de ne pas etre bloqué sur un connect
donc en modifiant mon code en
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
 
typedef struct MYVAR_READER{
 
	HWND	*phObjectHandle;
	CClntSock *m_pClientSock;
	short Nb_Reader;
 
}MYVAR_READER;
void CServeurDlg::RunReader(void)
{
	int i;
	MYVAR_READER* TheVarThread[NB_MAX_CONTROLER]; 
	for(i = 1; i <= Nb_Reader; i++) 
	{
		if ((m_pClientSock[i]->bEnabled) && (!m_pClientSock[i]->bInitRunning))
		{
			phObjectHandle = GetSafeHwnd();
			TheVarThread[i] = new MYVAR_READER;
			TheVarThread[i]->phObjectHandle = &phObjectHandle;
			TheVarThread[i]->Nb_Reader = Nb_Reader;
			TheVarThread[i]->m_pClientSock = m_pClientSock[i];
			m_pClientSock[i]->pThread = AfxBeginThread(InitReader_thread,TheVarThread[i]);
			m_pClientSock[i]->bInitRunning = true;
		}
 
	}
et en ayant lancé les thread passe dans les fonctions suivantes
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
 
UINT CServeurDlg::InitReader_thread( LPVOID Param )
{
	int i;
	MYVAR_READER* TheVarIn = (MYVAR_READER*)Param;
 
 
		if (!TheVarIn->m_pClientSock->bConnected) 
		{
			::PostMessage(*TheVarIn->phObjectHandle, WM_TRY_CONNECT, 0, (LPARAM)TheVarIn->m_pClientSock->m_rang);
			TheVarIn->m_pClientSock->bConnected = ConnectReader(TheVarIn->m_pClientSock);
			::PostMessage(*TheVarIn->phObjectHandle, WM_FIN_CONNECT, 0, (LPARAM)TheVarIn->m_pClientSock->m_rang);
		}
 
	::PostMessage(*TheVarIn->phObjectHandle, WM_FIN_THREAD, 0, (LPARAM)TheVarIn->m_pClientSock->m_rang);
	delete (TheVarIn);
	return 1;
}
bool CServeurDlg::ConnectReader(CClntSock* myreader)
{
	if (myreader->Create())
	{
		if (myreader->Connect(myreader->m_IpAddress,myreader->m_Portnum))
		{			
			return true;
		}
		else
		{
			myreader->Close();
			myreader->ErrorCode = Socket_Not_Connected;
			return false;
		}
	}
	else
	{
		myreader->ErrorCode = Socket_Not_Create;
		return false;
	}
 
return true;
mes connection se font bien, les thread s'arrete normalement mais je ne passe plus dans la fonction On receive de chacunes des classes
et je ne recois plus rien!

Quelle est la difference du point de vue de la classe CSocket connecter dans un thread ou non!

Cordialement