[c++/Cli/Winform] Problème mise a jour variables globale dans un thread
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:
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:
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:
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