IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

afficher dans une textbox


Sujet :

Visual C++

  1. #1
    Membre tr�s actif
    Homme Profil pro
    Electronicien
    Inscrit en
    Ao�t 2008
    Messages
    377
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Electronicien
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Ao�t 2008
    Messages : 377
    Par d�faut afficher dans une textbox
    Bonjour,

    Je cherche � afficher plusieurs valeurs dans diff�rentes textbox que je r�cup�re sur mon bus USB , pour l'instant j'arrive � afficher une valeur dans une textbox, comme �a

    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
     
    private: System::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);
     
     
    				valeur = IntFromBytesLittleEndian(buf, 0);
    				//Et on affiche en hexadécimal
    				SetText(valeur.ToString("X8"));
     
     
     
    			}
    			catch(...)
    			{
    			}
    		}
    avec

    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
    		private: void SetText(String^ text)
    		{
     
     
    			if (this->txtDataReceived->InvokeRequired)
     
    			{
     
     
    				SetTextCallback^ d = gcnew SetTextCallback(this,&VCCDC::Form1::SetText);	
    				this->Invoke(d, gcnew String(text));
     
    			}
    			else
    			{
     
    				textBox6->Clear();
    				textBox6->AppendText(text);
     
     
    			}
    		}
    Mais maintenant je souhaite afficher plusieurs valeurs, donc pour �a je fait un "switch case" comme �a

    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
     
    private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) 
    		{
     
    			try
    			{
     
     
     
    				//serialPort1->Read(data[4], 0, 4);
     
    				//textBox6->AppendText();
    				//nbr_octet=Read(data[4], 0, 4);
    				//val=IntFromBytesLittleEndian(data,4);
    				//SetText(serialPort1->ReadExisting());
     
     
    				//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);
     
    				switch (buf[3])
    				{
    				case 01 :	buf[3] = 0;
    							//On les convertit en int
    							valeur1 = IntFromBytesLittleEndian(buf, 0);
    							//Et on affiche en hexadécimal
    							SetText(valeur1.ToString("X8"));
    							//Et on affiche en décimal
    							//SetText(valeur1.ToString());
     
    							break;
    				case 02:	buf[3] = 0;
    							//On les convertit en int
    							valeur2 = IntFromBytesLittleEndian(buf, 0);
    							//Et on affiche en hexadécimal
    							SetText(valeur2.ToString("X8"));
    							//Et on affiche en décimal
    							//SetText(valeur.ToString());
    							break;
    				case 03:	buf[3] = 0;
    							//On les convertit en int
    							valeur3 = IntFromBytesLittleEndian(buf, 0);
    							//Et on affiche en hexadécimal
    							SetText(valeur3.ToString("X8"));
    							//Et on affiche en décimal
    							//SetText(valeur.ToString());
    							break;
    				case 04:	buf[3] = 0;
    							//On les convertit en int
    							valeur4 = IntFromBytesLittleEndian(buf, 0);
    							//Et on affiche en hexadécimal
    							SetText(valeur4.ToString("X8"));
    							//Et on affiche en décimal
    							//SetText(valeur.ToString());
    							break;
     
     
     
    				default:
    					//valeur = IntFromBytesLittleEndian(buf, 0);
    					//Et on affiche en hexadécimal
    					//SetText(valeur.ToString("X8"));
    					break;
    				}
     
     
     
     
    			}
    			catch(...)
    			{
    			}
    		}

    est-il possible d'afficher directement dans les case : exemple

    case 01

    faire quelques chose comme textbox6.Text = valeur1.ToString("X8"); Pour le moment pour afficher ma valeur je dois faire comme �a SetText(valeur1.ToString("X8"));

    avec dans la fonction

    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
    		private: void SetText(String^ text)
     
    		{
     
    			if (this->txtDataReceived->InvokeRequired)
     
    			{
     
    				SetTextCallback^ d = gcnew SetTextCallback(this,&VCCDC::Form1::SetText);
     
    				this->Invoke(d, gcnew String(text));
     
    			}
    			else
    			{
     
    				textBox6->Clear();
    				textBox6->AppendText(text);
     
     
     
     
    			}
    		}
    Je suis oblig� de passer par cette fonction pour afficher quelque chose dans une textbox ?
    un appendtext directement dans mon case ne fonctionne pas

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Eh bien, �a d�pend comment est articul� ton programme, au niveau multi-threading...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre tr�s actif
    Homme Profil pro
    Electronicien
    Inscrit en
    Ao�t 2008
    Messages
    377
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Electronicien
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Ao�t 2008
    Messages : 377
    Par d�faut
    Cette notion de Multi-threading m'�chappe quelques peu pour le moment.

    En faite, mon nouveau probl�me est que j'ai l'impression de recevoir tout mes packets de donn�es sur mon bus USB mais mon interface ne les ranges pas tout le temps dans la bonne textbox ?

    Dans mon micro via MPLAB je met un ID en poid fort sur mes valeurs avec cette fonction

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int ID(int valeur,char ID)
    {
    int ret;
     
    ret =valeur | ID<<24;
    //ret= valeur;
     
    return ret;
     
    }
    puis avec un case je balance mes valeurs

    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
    void ProcessIO1(void)
    {   
     
       if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
     
     
    				if(USBUSARTIsTxTrfReady())
    				{
     
    						switch(Data)
    						{
     
     
    						case 0 : ID_VAL=ID(ANA[0],ID_VAL1);
    								 //stringPrinted = TRUE;
    								 break;
     
    						case 1 : ID_VAL=ID(ANA[1],ID_VAL2);
    							     //stringPrinted = TRUE;
    							  	 break;
     
    						case 2 : ID_VAL=ID(ANA[2],ID_VAL3);
    							     //stringPrinted = TRUE;
    							  	 break;
     
    						case 3 : ID_VAL=ID(ANA[3],ID_VAL4);
    							     //stringPrinted = TRUE;
    							  	 break;
    						}
     
    				}
    		putUSBUSART(&ID_VAL,4);
     		CDCTxService();
     		//stringPrinted == FALSE;
    		Data++;
    		if (Data>=2) Data=0;
    }
    �a c'est au niveau du micro, et a priorie cela fonctionne bien

    Maintenant au niveau visual studio, je receptionne mes valeur tout en les identifiant par l'ID

    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
     
    private: System::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);
     
    				switch (buf[3])
    				{
    				case 1 :	buf[3] = 0;
    							//On les convertit en int
    							valeur1 = IntFromBytesLittleEndian(buf, 0);
    							SetText(valeur1.ToString());
    							val = 1;
    							break;
    				case 2 :	buf[3] = 0;
    							//On les convertit en int
    							valeur2 = IntFromBytesLittleEndian(buf, 0);
    							SetText(valeur2.ToString());
    							val = 2;
    							break;
    				case 3 :	buf[3] = 0;
    							//On les convertit en int
    							valeur3 = IntFromBytesLittleEndian(buf, 0);
    							SetText(valeur3.ToString());
    							val = 3;
    							break;
    				case 4 :	buf[3] = 0;
    							//On les convertit en int
    							valeur4 = IntFromBytesLittleEndian(buf, 0);
    							SetText(valeur4.ToString());
    							val = 4;
    							break;
     
     
     
    				default:
     
    					SetText("Pas de valeurs");
    					break;
    				}
     
     
    			}
    			catch(...)
    			{
    			}
    		}
    Puis je les affiche dans leur textbox respectives

    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
    		private: virtual void SetText(String^ text) sealed
     
    		{
     
    			if (this->txtDataReceived->InvokeRequired)
     
    			{
     
    				SetTextCallback^ d = gcnew SetTextCallback(this,&VCCDC::Form1::SetText);
     
    				this->Invoke(d, gcnew String(text));
     
    			}
    			else
    			{
     
    				switch (val)
    				{
    				case 1:	textBox6->Clear();
    						textBox6->AppendText(text);
    						break;
    				case 2:	textBox7->Clear();
    						textBox7->AppendText(text);
    						break;
    				case 4:	textBox8->Clear();
    						textBox8->AppendText(text);
    						break;
    				case 5:	textBox9->Clear();
    						textBox9->AppendText(text);
    						break;
    				default:
     
    				break;
     
    				}
    Est-que cette fa�ons de faire semble �tre correcte, en tout �a il a l'aire d'afficher diff�rentes valeurs dans diff�rentes textbox, seulement :

    1-l'affichage s'intille bizzarement, serait-ce ma m�thode qui est pas bonne, pour afficher une nouvelle valeur receptionn�, je fais un textBox->Clear(); Avant ?

    2-les diff�rentes valeurs ne vont pas tout le temps dans la bonne textbox j'ai donc plusieurs valeurs qui ce telescope sur la m�me textbox

    3-j'ai toujours cette latence entre le moment ou les valeurs changent et l'affichage

    Que veux-tu dire par threading ?

    Merci pour l'aide apport�, connaissant le C(microproc) et le pascal(delphi), je suis un peu d�rout� par visual C++ pour l'instant qui me parait moins instinctif si je puis dire, tr�s certainement par ce que peu familiariser avec l'environnement que j'essai d'apprivois�.

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Le "id << 24" me laisse un doute: Je ne suis pas s�r que id soit promu en int avant l'op�rateur. � ta place, je m'en assurerais explicitement:
    Code C++/CLI : S�lectionner tout - Visualiser dans une fen�tre � part
    ret =valeur | (int)ID << 24;
    Ou bien je prendrais directement un int en param�tre, la promotion se faisant alors lors de l'appel de fonction.

    ---------------------------------------------------------

    Ensuite, pour le coup du multithreading, c'est simple: InvokeRequired ne retourne true que s'il est invoqu� depuis un autre thread que celui � qui appartient le contr�le.

    Si tout se passe sur un seul thread, il n'y a pas besoin de Invoke(). Alors, tout d�pend de la fa�on dont marche SerialPort:ataReceived. Et la r�ponse appara�t dans l'aide: SerialPort d�clenche ses �v�nements sur un thread s�par�, Invoke() est donc n�cessaire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre tr�s actif
    Homme Profil pro
    Electronicien
    Inscrit en
    Ao�t 2008
    Messages
    377
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Electronicien
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Ao�t 2008
    Messages : 377
    Par d�faut
    Pour ce code , j'ai d�clar� ailleur l'ID en tant qu' entier(int)

    ret =valeur |ID << 24;
    comment d�finis-tu un "thread", quand j'interroge google on me dit comment les utilis�s ou d'autre explications trop complexe pour moi mais je ne per�ois pas � quoi �a correspond.

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Un thread, �galement appel� "processus l�ger" dans le monde *n*x, c'est un flux d'ex�cution parall�le dans le m�me processus.

    Dans un syst�me multi-t�ches pr�emptif comme tous les OS modernes, le (ou de nos jours, les) c�ur(s) processeur(s) effectue(nt) plusieurs t�ches "en m�me temps" (avec un seul processeur mono-c�ur, � la place il alterne tr�s vite).
    Deux fonctions dans deux threads diff�rents peuvent donc tourner en m�me temps et ind�pendamment l'une de l'autre (si l'une reste � attendre qu'on presse une touche ou clique un bouton, l'autre peut attendre autre chose, comme surveiller le port s�rie)

    Sous Windows, tout processus commence avec un seul thread, et peut en lancer d'autres. Le thread principal sert � ton interface utilisateur (bo�te de dialogue, etc.).Le SerialPort utilise un thread s�par� pour surveiller le port s�rie, attendre qu'il se passe quelque chose dessus, et appeler les delegates des �v�nements comme DataReceived.

    Comme ils s'ex�cutent sur deux threads diff�rents, si tu veux modifier ton interface utilisateur tu dois faire l'appel d'un thread � l'autre: Et pour �a, utiliser Invoke() qui s'occupe de toute la synchronisation n�cessaire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre tr�s actif
    Homme Profil pro
    Electronicien
    Inscrit en
    Ao�t 2008
    Messages
    377
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Electronicien
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Ao�t 2008
    Messages : 377
    Par d�faut
    Encore un fois Merci pour l'�clairage sur cette notion de thread, cela ma permis de comprendre et de r�ussir ce que je voulais faire, afficher plusieurs valeurs dans leur textbox respectives.

    Par contre, je sais pas a quoi c'est li� mais mes valeurs varies quelques secondes apr�s la variation de tension appliqu�, environ de 4 � 30 seconde en fonction du nombres de valeurs r�cup�r�es dans "serialPort1_DataReceived" et affich� dans " SetText" ?
    Images attach�es Images attach�es  

  8. #8
    Membre tr�s actif
    Homme Profil pro
    Electronicien
    Inscrit en
    Ao�t 2008
    Messages
    377
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Electronicien
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Ao�t 2008
    Messages : 377
    Par d�faut
    Mes valeurs varies maintenant � la second, donc �a c'est r�solu.

    J'ai ouvert un autre sujet sur un autres probl�me de form qui frise sur lequel je ne peux plus rien faire dessus, seulement mes valeur continu a bien s'affich�es

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [D�butant] Afficher dans une TextBox via des Boutons
    Par Axel_E dans le forum Visual Studio
    R�ponses: 3
    Dernier message: 12/05/2015, 14h47
  2. R�ponses: 13
    Dernier message: 07/07/2008, 14h29
  3. R�ponses: 7
    Dernier message: 04/07/2008, 17h25
  4. Afficher dans une textbox pendant l'ex�cution
    Par cedric.synix dans le forum VB.NET
    R�ponses: 9
    Dernier message: 24/09/2007, 12h30
  5. [c#]Gros text à afficher dans une textbox
    Par famemaur dans le forum ASP.NET
    R�ponses: 3
    Dernier message: 04/05/2005, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo