Bonjour tout le monde,

J'ai besoin de vos aides SVP.

En fait, je suis entrain de développer une interface graphique avec les API win32. J'ai un premier bouton "Start" dont son appuie ouvre la communication sur le port UART avec une carte électronique ainsi que l'écriture et la lecture des messages.
En fait, à travers cette communication je traite des données et je les stocke ensuite dans une base de donnée. Je veux que communication soit en boucle infinie et ne s'arrête que lorsque j'appuie sur le deuxième bouton qui doit stopper ainsi cette boucle et ferme le port .

D'après mes connaissances de bases, il s'agit d'une manipulation des threads.
En fait, j'ai compris qu'il faut suivre cette procédure:
Lorsque j'appuie sur le premier bouton, je lance un thread qui va éxécuter ce while(1) et vérifier l'état d'une variable qui va permettre d'interrompre la boucle infinie.
Lorsque j'appuie sur le second bouton, je change l'état de cette variable pour sortir de cette boucle infinie.

Mais J'ai pas vraiment une vision claire de ce que je dois faire au niveau de mon code.


voici mon main (modifié: à la base plus long)
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
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
 
 
#include <windows.h>
#include <stdint.h>
#include <stdio.h>
#include <tchar.h>
#include <setupapi.h>
#include <locale.h>
 
#define ID_B_START 0
#define ID_B_Stop 1
#define ID_B_Exit 2
 
HINSTANCE instance;
 
 
 
 
LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);
void Communication (HANDLE hCom,  DCB dcb);
void Fermeture (HANDLE hCom,  DCB dcb);
 
int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage)
{
    HWND fenetrePrincipale;
    MSG message;
    WNDCLASS classeFenetre;
    HMENU menu;
 
    instance = cetteInstance;
 
 
 
    menu = CreateMenu();
    AppendMenu(menu, MF_POPUP, (UINT)sousMenu, L"File");
 
 
 
    classeFenetre.style = 0;
    classeFenetre.lpfnWndProc = procedureFenetrePrincipale; //fct callback
    classeFenetre.cbClsExtra = 0;
    classeFenetre.cbWndExtra = 0;
 
    classeFenetre.hInstance = NULL;
    classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeFenetre.lpszMenuName = NULL;
    classeFenetre.lpszClassName = L"classeF";
 
    // On prévoit quand même le cas où ça échoue
    if(!RegisterClass(&classeFenetre))
		return FALSE;
 
    fenetrePrincipale = CreateWindow(
		L"classeF", 
		L"Interface STPM34 !",
		WS_OVERLAPPEDWINDOW, 
		CW_USEDEFAULT,
		CW_USEDEFAULT, 
		400, 
		400, 
		NULL,
		menu  , 
		cetteInstance, 
		NULL);
 
    if (!fenetrePrincipale) 
		return FALSE;
 
    ShowWindow(fenetrePrincipale, modeDAffichage);
    UpdateWindow(fenetrePrincipale);
 
 
    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}
 
LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
       static HWND bouton0 = {NULL};
	static HWND bouton1 = {NULL};
	static HWND bouton2 = {NULL};
	static DCB dcb;
       static HANDLE hCom;
 
    switch (message)
    {
        case WM_CREATE:
 
 
 
                bouton0 = CreateWindow(
					L"BUTTON",
					L"Start", 
					WS_CHILD | WS_VISIBLE,
					5,
					125,
					383,
					30,
					fenetrePrincipale, 
					(HMENU)ID_B_START,
					instance,
					NULL);
 
		bouton1 = CreateWindow(
					L"BUTTON", 
					L"Stop", 
					WS_CHILD | WS_VISIBLE,
					5,
					165,
					383, 
					30,
					fenetrePrincipale,
					(HMENU)ID_B_Stop,
					instance, 
					NULL);
 
                bouton2 = CreateWindow(
					L"BUTTON", 
					L"Exit", 
					WS_CHILD | WS_VISIBLE,
					5,
					205,
					383, 
					30,
					fenetrePrincipale,
					(HMENU)ID_B_Exit,
					instance, 
					NULL);
 
 
 
 
 
            return 0;
 
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
 
				case ID_B_START:
                                 /*Cette fonction ouvre le port tout en effectuant la configuration nécessaire puis lance l'envoie et le récupération 
                                   des messages d'une manière dans une boucle while. En fait, pour elle traite un nombre défini des                                  
                                   données  reçues et les stocke dans une base de données et refait le même travail */
 
				    Communication (hCom, dcb, &ListItemBaudRate,&ListItemPort); 
 
				     break;
				case ID_B_Stop:
                                /* Je veux que lorsque j'appuie sur ce bouton, la fonction Communication s'arrete pour que je ferme le port */
				    Fermeture (hCom, dcb);
                                    break;
                               case ID_B_Exit:
                                  SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0);
                                  break;
            }
            return 0;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
 
        default:
            return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
    }
}
Si quelqu'un pourra m'aider SVP.

Merci d'avance