Bonjour,
Je dois réaliser un projet devant permettre de manipuler un robot à distance.
J'ai donc un thread de réception de l'état des capteurs ( comme la vitesse ) qui ne pose aucun problème, et un thread d'envoi d'instructions.
Dans ce thread, je test deux variables globales( roue_g et roue_d) pour savoir si le robot doit avancer/tourner/reculer. Ces deux variables sont modifié par 4 bouton ( G/D/Av/Ar ) lors de l'evenement Mouse_Down.
Seulement, lorsque je clique sur le bouton AR par exemple, le thread ne remarque pas le changement de valeur des variables. Ce qui est bizarre car j'arrive à afficher leurs valeurs via des labels, et les résultats affiché sont cohérents.
Mon thread est lancé lors de la connection au robot ( ou j'initialise aussi les valeurs à envoyer au robot ) :
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
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
		{
			if( socket_ok == false )
			{
				struct sockaddr_in lui ;
				lui.sin_family = AF_INET ;
				lui.sin_addr.s_addr = inet_addr("127.0.0.1") ;
				lui.sin_port= htons(15000);
				WSADATA wsadata ;
 
				if ( WSAStartup(MAKEWORD(1,1),&wsadata) == SOCKET_ERROR)
				{
					button1->Text="Erreur WSAStartup";
				}
 
				if ((maSocket=socket(AF_INET, SOCK_STREAM , 0 )) == SOCKET_ERROR)
				{
					button1->Text="Erreur de création du socket" ;
				}
 
				if (connect(maSocket,(struct sockaddr*)&lui,sizeof(lui)) == SOCKET_ERROR)
				{
					button1->Text="Erreur de connection";					
				}
				else
				{
					button1->Text="Deconnection";
					socket_ok = true ;
					roue_g = 0 ;
					roue_d = 0 ;
					// LANCEMENT DES THREAD QUAND LA CONNECTION EST BIEN ETABLI
					Thread ^t_e = gcnew Thread(gcnew ThreadStart(this,&IHM_WF::Form1::Th_Envoi));
					t_e->Start() ;		
					Thread ^t_r = gcnew Thread(gcnew ThreadStart(this,&IHM_WF::Form1::Th_Reception));
					t_r->Start() ;	
				}
 
 
			}
			else if( socket_ok == true )
			{
				socket_ok = false ;
				closesocket(maSocket) ;
				button1->Text="Connection";
 
			}
		}
Voici le code du thread :

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
// ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// THREAD D'ENVOI
public: void Th_Envoi()
			{				
				char sendbuf[2] ;
				while(socket_ok == true)
				{
					// SI PAS DE PRESSION SUR BOUTON
					if( (roue_g == 0) && ( roue_d == 0 ))
					{
						sendbuf[0]=(char)(0) ;
						sendbuf[1]=(char)(0) ;
					}
					// SI MARCHE ARRIERE
					if( (roue_g == 1) && ( roue_d == 1 ))
					{
						sendbuf[0]=(char)(49);//((( x_vitesse / 100 )*63) & 191 ) ;
						sendbuf[1]=(char)(112) ;//((( x_vitesse / 100 )*63) & 191 ) ;
					}
					//sendbuf[0]=(char)(49);
					//sendbuf[1]=(char)(112);
					send(maSocket,sendbuf,2,0);
				}				
			}
Celui du mouse_down pour aller en arriere :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
private: System::Void btn_arriere_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
			 roue_g = 1 ;
			 roue_d = 1 ;
		 }
 
private: System::Void btn_arriere_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
			 roue_g = 0 ;
			 roue_d = 0 ;
		 }
Faut-il faire une mise a jour dans le thread ( un update() ou un truc du genre ? ) !

Merci beaucoup