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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?