Bonjour,
J'utilise la classe de farscape que j'ai intégré dans une DLL. Je peux donc l'instancier à partir d'une autre application.
Par contre, j'ai deux problèmes au niveau du thread avec SendMessage(), voici le code:
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
|
//-----------------------------------------
/*static*/ UINT CCommSerie::Thread(LPVOID pParam)
{
//
CCommSerie *pCom = (CCommSerie*)pParam;
int nResult;
DWORD WaitEvent = 0;
DWORD dwError=0;
DWORD dwMaskEvent=0;
//POUR ESSAI, A EFFACER
//pCom->m_pParent->SendMessage(WM_CCOMRCV,(WPARAM)pCom,dwMaskEvent);
pCom->m_bThreadExist=true; // amorce l'existance du thread
while(1)
{
nResult=pCom->WaitCommEvent(dwMaskEvent);
if (!nResult)
{
switch(dwError=GetLastError())
{
case 87:
case ERROR_IO_PENDING:
break;
default:
{
// erreur de communication on fait suivre ...
pCom->GetError();
pCom->OnError(dwError);
break;
}
}
}
else
{
if(pCom->IsRXEmpty()) continue;
}
// attente evenement pour sortie eventuelle du thread ou reception
WaitEvent = WaitForMultipleObjects(2, pCom->m_hArrayEvent, FALSE, INFINITE);
switch (WaitEvent)
{
case 0: //Fermeture Thread
pCom->m_bThreadExist=false;
AfxEndThread(1);
return(0);
case 1:dwMaskEvent=pCom->GetCommMask();
if(dwMaskEvent & EV_RXCHAR) // reception sur la voie.
pCom->m_pParent->SendMessage(WM_CCOMRCV,(WPARAM)pCom,dwMaskEvent);
if ((dwMaskEvent & EV_CTS) || // evenements divers.
(dwMaskEvent & EV_RXFLAG) ||
(dwMaskEvent & EV_BREAK) ||
(dwMaskEvent & EV_ERR)
|| (dwMaskEvent & EV_RING))
{
pCom->m_pParent->SendMessage(WM_CCOMEVENT,(WPARAM)pCom,dwMaskEvent);
}
break;
}
};
return 0;
} |
Voici comment j'ai procédé:
Afin de tester la gestion des événements, dès que je rentre dans le thread j'envoie l'événement WM_CCOMRCV à mon thread principal(appli utilisant la dll). Celui-ci déclenche juste une AfxMsgBox. Jusque là, pas de soucis!
Par contre, une fois le message envoyé, je me retrouve avec un plantage (0xC0000005) sur la ligne suivante:
nResult=pCom->WaitCommEvent(dwMaskEvent);
Je ne l'explique pas...
Pour continuer dans mes tests, je mets en commentaires l'envoie de l'événement précédent, et dans le thread principal, instanciant CCom, j'envoie des données sur la ligne série. Ligne série à laquelle j'ai connecté RX à TX au bout pour récupérer les infos émises.
J'arrive donc à la ligne suivante dans le thread:
1 2 3 4
|
case 1:dwMaskEvent=pCom->GetCommMask();
if(dwMaskEvent & EV_RXCHAR) // reception sur la voie.
pCom->m_pParent->SendMessage(WM_CCOMRCV,(WPARAM)pCom,dwMaskEvent); |
mais cette fois ci, je reste bloqué sur cette fonction, étant donné qu'il me semble que le message n'est pas traité puisque aucun appel à la fonction associé au message n'est fait.
Je ne comprends pas à nouveau pourquoi...Une idée?
Merci
Nicolas
Partager