Bonjour
Dans un appli dialog based j'ai une classe heritant d'une CSocket
class CClntSock : public CSocket
Cette classe derive la methode OnReceive afin de travailler avec des socket asynchrone
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.
CClntSock *m_pClientSock[NB_MAX_CONTROLER];
Dans le initdialog je cree les nouveaux elements et je les initialise
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
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
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
Partager