comment faire une condition sur l'effet d'un button nommé Deconnexion
if (Deconnexion->Enabled) serialPort1->Close;
au mieux je souhaiterai fermer ma connexion serialPort1->Close; sur l'action d'un clic sur la croix de mon form principal.
Merci
comment faire une condition sur l'effet d'un button nommé Deconnexion
if (Deconnexion->Enabled) serialPort1->Close;
au mieux je souhaiterai fermer ma connexion serialPort1->Close; sur l'action d'un clic sur la croix de mon form principal.
Merci
Tu veux dire un événement ou une condition?
Pour une condition, généralement on les fait sur des checkboxes plutôt que sur des boutons.
Bah en fait j'ai créé un bouton pour déconnecté le bus USB avant la fermeture du form par ce que quand je souhaitai fermer mon form alors qu'il était encore en train de récupère mes valeurs celui-ci frisait et ne ce fermait plus, je suis obliger de faire un alt contrôle sup pour arrêter l'application.
Je pense qu'il faut donc que je ferme ma connections USB au moment ou je clic sur la croix du form principal, mais je n'y suis pas arriver
Ah, je pense qu'il y a un risque qu'il y ait un problème de "verrou mortel" où chaque thread attend une réponse de l'autre...
Pour les appels où il n'est pas essentiel d'attendre que le thread graphique ait fini de mettre à jour ses contrôles avant de continuer, tu peux remplaçer les Invoke() par des BeginInvoke() (mais pour ça, il va falloir modifier la fonction SetText() ou en faire une copie que tu modifies ensuite).
Bonjour,
j'ai donc mis un BeginInvoke() dans ma fonction SetText() comme ça
a cet endroit this->Invoke(d, gcnew String(text)); remplacer par this->BeginInvoke(d, gcnew String(text));
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 private: virtual void SetText(String^ text) sealed { if (this->Analog0->InvokeRequired) { SetTextCallback^ d = gcnew SetTextCallback(this,&VCCDC::Form1::SetText); this->BeginInvoke(d, gcnew String(text)); } else { Analog0->Clear(); Analog0->AppendText(valeur1.ToString()); Analog1->Clear(); Analog1->AppendText(valeur2.ToString()); Analog2->Clear(); Analog2->AppendText(valeur3.ToString()); Analog3->Clear(); Analog3->AppendText(valeur4.ToString()); Analog4->Clear(); Analog4->AppendText(valeur5.ToString()); Analog5->Clear(); Analog5->AppendText(valeur6.ToString()); Analog6->Clear(); Analog6->AppendText(valeur7.ToString()); Analog7->Clear(); Analog7->AppendText(valeur8.ToString()); Analog8->Clear(); Analog8->AppendText(valeur9.ToString()); } }
en fait, ça résoud mon problème de latence exposé là
http://www.developpez.net/forums/d13...icher-textbox/
dont mes valeurs varie à la second de réaction maintenant, seulement il met impossible de bouger la fenêtre ou de la fermer
a vrai dire j'ai du mal à comprendre ce que fait cette condition
Si je comprend bien cette condition, on vient chercher les valeurs disponible dans l'autre thread "serialPort1_DataReceived" au quel cas on n'affiche pas tout de suite, donc on ne passe pas dans le else, et si la condition est false donc "serialPort1_DataReceived" n'est plus disponible on affiches les valeurs récupérées.
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 private: virtual void SetText(String^ text) sealed { if (this->InvokeRequired) { SetTextCallback^ d = gcnew SetTextCallback(this,&VCCDC::Form1::SetText); this->BeginInvoke(d, gcnew String(text)); } else { Analog0->Clear(); Analog0->AppendText(valeur1.ToString()); Analog1->Clear(); Analog1->AppendText(valeur2.ToString()); Analog2->Clear(); Analog2->AppendText(valeur3.ToString()); Analog3->Clear(); Analog3->AppendText(valeur4.ToString()); Analog4->Clear(); Analog4->AppendText(valeur5.ToString()); Analog5->Clear(); Analog5->AppendText(valeur6.ToString()); Analog6->Clear(); Analog6->AppendText(valeur7.ToString()); Analog7->Clear(); Analog7->AppendText(valeur8.ToString()); Analog8->Clear(); Analog8->AppendText(valeur9.ToString()); } }
Ce code est bizarre, car dans le else il devrait utiliser text, et ne l'utilise pas...
Normalement, il faudrait un truc du genre:
Et ça peut encore être amélioré, en passant directement les deux textboxes et valeur à la fonction SetText()...
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 private: delegate void SetTextCallbackSetText(TextBox^ textBoxARegler, String^ text); void SetText(TextBox^ textBoxARegler, String^ text) { if(this->InvokeRequired) { SetTextCallback^ d = gcnew SetTextCallback(this, &VCCDC::Form1::SetText); this->BeginInvoke(d, textBoxARegler, text); } else { //Pas la peine de faire Clear() + AppendText(), on peut faire les deux d'un coup textBoxARegler->Text = text; } } private: void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) { try { //Un tableau managé de quatre bytes array<System::Byte>^ buf = gcnew array<System::Byte>(4); //On lit les quatre bytes serialPort1->Read(buf, 0, 4); System::Byte highByte = buf[3]; buf[3] = 0; int valeur = IntFromBytesLittleEndian(buf, 0); System::String^ hexText = valeur.ToString("X8"); System::String^ decText = valeur.ToString(); switch (highByte) { case 1 : SetText(Analog0, hexText); SetText(Analog1, hexText); break; case 2 : SetText(Analog2, hexText); SetText(Analog3, hexText); break; case 3 : SetText(Analog4, hexText); SetText(Analog5, hexText); break; case 4 : SetText(Analog6, hexText); SetText(Analog7, hexText); break; default: //valeur = IntFromBytesLittleEndian(buf, 0); //Et on affiche en hexadécimal //SetText(valeur.ToString("X8")); break; } } catch(...) { } }
Merci
Par contre j'ai cette erreur sur
SetTextCallback^ d = gcnew SetTextCallback(this, &VCCDC::Form1::SetText);
avec
Erreur 1 error C3352: 'void VCCDC::Form1::SetText(System::Windows::Forms::TextBox ^,System::String ^)'*: la fonction spécifiée est incompatible avec le type délégué 'void (System::String ^)'
Tu dois modifier la déclaration du délégué SetTextCallback.
Effectivement pas mal cette architecture que tu proposes mais j'ai cherché ce qui ce passe au sujet de l'erreur que j'ai descrit sur le précédent poste et je ne vois pas pour l'instant quel est le problème .
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 private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) { try { array<System::Byte>^ buf = gcnew array<System::Byte>(4); //On lit les quatre bytes serialPort1->Read(buf, 0, 4); System::Byte highByte = buf[3]; buf[3] = 0; int valeur = IntFromBytesLittleEndian(buf, 0); System::String^ hexText = valeur.ToString("X8"); //Et on affiche en hexadécimal System::String^ decText = valeur.ToString(); //Et on affiche en décimal switch (highByte) { case 1 : SetText(Analog0, decText); break; case 2 : SetText(Analog1, decText); break; case 3 : SetText(Analog2, decText); break; case 4 : SetText(Analog3, decText); break; case 5 : SetText(Analog4, decText); break; case 6 : SetText(Analog5, decText); break; case 7 : SetText(Analog6, decText); break; case 8 : SetText(Analog7, decText); break; case 9 : SetText(Analog8, decText); break; case 10: SetText(Analog9, decText); break; case 11: SetText(Analog10, decText); break; default: //valeur = IntFromBytesLittleEndian(buf, 0); //Et on affiche en hexadécimal //SetText("Pas de valeurs"); break; } } catch(...) { } } private:delegate void SetTextCallbackSetText(TextBox^ textBoxARegler, String^ text); void SetText(TextBox^ textBoxARegler, String^ text) { if (this->InvokeRequired) { SetTextCallback^ d = gcnew SetTextCallback(this, &VCCDC::Form1::SetText); this->BeginInvoke(d, textBoxARegler, text); } else { //Pas la peine de faire Clear() + AppendText(), on peut faire les deux d'un coup textBoxARegler->Text = text; } }
J'ai mis tout par ce que je ne sais pas d'ou peu provenir le problème, sachant que j'ai donc réadapté le code par rapport a ce que tu m'a détaillé
OK C'est compris , et ça fonctionne enfin, aller maintenant je m'attaque à l'envoi de données vers ma maquette.
Merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager