Bonjour
Dans un appli dialog based j'ai une classe heritant d'une CSocket
Cette classe derive la methode OnReceive afin de travailler avec des socket asynchroneCode:class CClntSock : public CSocket
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:virtual void OnReceive(int nErrorCode);
Dans le initdialog je cree les nouveaux elements et je les initialiseCode:CClntSock *m_pClientSock[NB_MAX_CONTROLER];
Si je n'est pas d'erreur tout va bien et je recoit comme je le veux par la méthode overide OnReceiveCode:
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)) } } }
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
et en ayant lancé les thread passe dans les fonctions suivantesCode:
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; } }
mes connection se font bien, les thread s'arrete normalement mais je ne passe plus dans la fonction On receive de chacunes des classesCode:
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;
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