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 ) :
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
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"; } }
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
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); } }
Faut-il faire une mise a jour dans le thread ( un update() ou un truc du genre ? ) !
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 ; }
Merci beaucoup
Partager