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 du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    361
    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 : 361
    Points : 53
    Points
    53
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Eh bien, ça dépend comment est articulé ton programme, au niveau multi-threading...

  3. #3
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    361
    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 : 361
    Points : 53
    Points
    53
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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.

  5. #5
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    361
    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 : 361
    Points : 53
    Points
    53
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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.

  7. #7
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    361
    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 : 361
    Points : 53
    Points
    53
    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 du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    361
    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 : 361
    Points : 53
    Points
    53
    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