[API Win32 sans MFC] Lecture port série: thread bloqué
Bonjour à tous,
Je lis des données dès qu'elle arrivent sur le port COM avec la fonction WaitCommEvent.
Pour éviter de figer l'application, j'utilise un thread.
Du coup, comme la fonction est bloquante... Impossible de le terminer proprement:
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
| DWORD WINAPI ReceptionThread(LPVOID p) {
HANDLE hStopEvent = (HANDLE) p;
DWORD dwWait;
BOOL fRun = TRUE;
DWORD dwCommStatus; // variable de stockage pour les évènements
CString strValue;
char *ptr,temp[MAX_LOADSTRING]="";
unsigned int TextLen;
ptr = temp;
while(fRun) {
dwWait = WaitForSingleObject(hStopEvent,1000);
switch(dwWait) {
case WAIT_OBJECT_0: // L'événement stop a été déclenché, sortir proprement du thread
fRun = FALSE;
break;
case WAIT_TIMEOUT: // Chaque seconde, effectuer le boulot
TextLen = GetWindowTextLength(hEdtT); // Récupère le nombres de caractères dans le EditBox
// Cette fonction est bloquante, elle va attendre des événements définit par le mask et
// Elle stockera le type d'événement qui l'aura réveillée dans une variable. (est de type LPOVERLAPPED)
// PRM1: Pointeur sur la variable de stockage pour les évènements(de type LPDWORD)
// PRM2: pointeur sur la structure d'overlapped Ici il n'y en a pas.
WaitCommEvent(hPort,&dwCommStatus,0);
while (lirePort(ptr)>0) {
strValue.Format(L"%s",ptr);
SendMessage(hEdtT,EM_SETSEL,TextLen,TextLen); // Placer le curseur à la fin
SendMessage(hEdtT,EM_REPLACESEL,0,(LPARAM)(LPCTSTR)strValue); // Ecrit le texte
TextLen += strValue.GetLength();
}
break;
}
}
return 0;
} |
La procédure de fermeture du thread se fige à WaitForSingleObject
Code:
1 2 3 4 5
| SetEvent(hStopEvent);
DWORD dwWait = WaitForSingleObject(rThread,INFINITE);
if (WAIT_OBJECT_0 == dwWait)
MessageBox(NULL,L"Le thread est terminé",L"Exemple", MB_OK);
CloseHandle(rThread); // Fermer le thread |
Comment faire ?