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

C# Discussion :

Exécuter userControl en arrière plan


Sujet :

C#

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 15
    Par défaut Exécuter userControl en arrière plan
    Bonjour ,

    Je code en C# maintenant depuis un an et je commence à développer des choses intéressantes. Je suis automaticien et j'ai comme projet de développer un système le plus complet possible avec un PC. Le PC me sert d'automate, de serveur base de données et de moyen de supervision. Pour l'instant je communique avec des base d'entrées/sorties déportés grâce à mes méthodes MODBUS, je peux enregistrer des évenement dans des bases de données, etc.... Pour l'instant je suis assez content de mon travail .
    Une seule chose me pose problème: l'interface graphique.

    j'ai un premier usercontrol qui contient un Datagridviwer , les valeurs des deux variables dans la premiére photo se renouvelle chaque 2 secondes via un timer, en méme temps je veux tracer ces deux variable dans un chart realtime qui existe dans un deuxiéme UserControl qui me prends le deux valeur à chaque passage du timer et les traces

    Nom : Capture.JPG
Affichages : 254
Taille : 57,2 Ko

    Nom : Capture2.JPG
Affichages : 376
Taille : 22,0 Ko

    mon code pour tracage des deux valeurs dans usercontrol

    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
    public void loadchartchart3()
            {
                for (int iplot = 0; iplot < this.chart2.Series.Count; iplot++)
                {
                    if (this.chart2.Series[iplot].Points.Count > nbPointAffiches)
                    {
                        this.chart2.Series[iplot].Points.RemoveAt(0);
                    }
     
                    else // sinon on insere le suivant
                    {
                        // incrementation  var TheDateTimeNow
                        TheDateTimeNow = TheDateTimeNow.AddSeconds(30);
     
     
                        // nouveau point
                        Random r = new Random();
     
                        double pitch_Col2dr = r.Next(1, 45);
                        double rosll_Col2r = r.Next(10, 1000);
                        objsexdof2.FillMainTable(2);
                        DataPoint newPt = new DataPoint();
                        newPt.XValue = TheDateTimeNow.ToOADate();
                        newPt.YValues[0] = pitch_Col2dr;
                        this.chart2.Series[0].Points.Add(newPt);
                        DataPoint newPt2 = new DataPoint();
                        newPt2.XValue = TheDateTimeNow.ToOADate();
                        newPt2.YValues[0] = rosll_Col2r;
                        this.chart2.Series[1].Points.Add(newPt2);
                    }
                }
            }
    Code premier usercontrol là ou je récupére les valeurs des variables avec le timer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       private void timer1_Tick(object sender, EventArgs e)
            {
     
                .
                .
     
     
     
     
     
                objchart.loadchartchart3();
     
            }
    le problème c'est j'arrive pas à faire tourner les 2éme usercontrol en même temps avec le premier pour qu'il me trace au fur et au mesure les deux variables
    Images attachées Images attachées  

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Pour exécuter des taches simultanément il faut que tu regardes du côté des Threads.

    ++

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    Le problème vient je pense des propriétés de tes Series. L'exercice m'amusait donc j'ai tenté de faire un petit truc qui répondra à certaine des tes questions je pense.

    - Tout d'abord, ne pas créer un objet Random à chaque appel. Tu en fais une variable private globale à ton objet.
    - Ensuite tu crées une méthode d'initialisation de ton chart afin de définir les propriétés des series et du ChartArea :
    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
     
     private void initializeChart()
    {
    	r = new Random();  // r est une variable privée de la classe
    	// Propriétés des series (Line / X = Time / Y = Single) :
    	for (int iplot = 0; iplot < this.chart.Series.Count; iplot++)
    	{
    		Series s = this.chart.Series[iplot];
    		s.YValueType = ChartValueType.Single;
    		s.XValueType = ChartValueType.Time;
    		s.ChartType = SeriesChartType.Line;
    	}
    	// Propriété du ChartArea :
    	chart.ChartAreas[0].AxisX.LabelStyle.Format = "mm:ss";
    }
    Dans mon exemple, j'ai défini le nombre de points à afficher à 10:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     private int nbPointAffiches = 10;
    Ensuite la méthode pour ajouter un point au chart appelé toutes les seconde par exemple:
    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
     
    private void BuildChart()
    {
    	// Positionne les min et max de l'axe X :
    	chart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-5).ToOADate();
    	chart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(5).ToOADate();
     
    	// Boucle sur les series :
    	for (int iplot = 0; iplot < this.chart.Series.Count; iplot++)
    	{
    		// Supprime le premier point de la série si nécessaire :
    		if (this.chart.Series[iplot].Points.Count > nbPointAffiches)
    			this.chart.Series[iplot].Points.RemoveAt(0);
    	}
    	double pitch_Col2dr = r.Next(1, 500);
    	double rosll_Col2r = r.Next(10, 1000);
    	// Ajoute un point Y aléatoire à l'heure Now :
    	this.chart.Series[0].Points.AddXY(DateTime.Now.ToOADate(), pitch_Col2dr);
    	this.chart.Series[1].Points.AddXY(DateTime.Now.ToOADate(), rosll_Col2r);
    }
    Cela ajoute un point sur chacun des deux series à chaque appel.

    Ce code sera à adapter à ce que tu veux faire mais il doit être fonctionnel.

    Ca donne ceci :
    Nom : Capture.PNG
Affichages : 200
Taille : 37,4 Ko

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 15
    Par défaut
    @ebastien
    Merci pour le code, mais ça n'a pas résolut le problème.
    Le problème ne vient pas du code de tracage de la courbe.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 15
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    Bonjour,

    Pour exécuter des taches simultanément il faut que tu regardes du côté des Threads.

    ++
    tu peux me détailler un peu stp

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Citation Envoyé par Moafandi Voir le message
    Merci pour le code, mais ça n a pas résolut le problème
    Je n'ai fait que reprendre ton code et modifier les propriété des series afin que les points soient correctement affichés.
    Je ne pense pas que tu aies besoin de thread étant donnée que tu utilises un timer pour récupérer tes valeurs. A chaque thick du timer, tu envoies le point dans ton Grid et à ton Chart. Ca devrait le faire.

    Donc quel est exactement ton problème ? Est-ce : Comment récupérer les points sur mon Chart depuis mon timer qui se trouve sur un autre UserControl ?

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 15
    Par défaut
    Le problème c'est que jarrive pas a tracer les points que j'ai ajouter dans le chart , il stocke bien le nombre de points demandés mais il les traces pas

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Ok, c'est bien ce que j'avais compris. Comment as-tu initialisé les axes de ton chart pour chaque series (min/max/ChartType/xValueType etc...) ?

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 15
    Par défaut
    dans userControl1_load

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          private void UserControl1_Load(object sender, EventArgs e)
            {
                this.chart2.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";
                  this.chart2.ChartAreas[0].AxisY.Minimum = 10;
                    this.chart2.ChartAreas[0].AxisY.Maximum = 1000;
                initializeChart();
            }

  10. #10
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bon, ça va être compliqué de t'aider si tu donnes les infos ligne par ligne. On n'a aucune visibilité sur ton code dans sa globalité. Je t'ai donné un code fonctionnel inspiré de celui que tu as fourni.
    Tout ce que tu indiques c'est que tu "n'arrives pas à afficher les points". Donne un bout de code fonctionnel que l'on puisse tester et voir pourquoi le chart ne trace pas la courbe.

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 15
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Bon, ça va être compliqué de t'aider si tu donnes les infos ligne par ligne. On n'a aucune visibilité sur ton code dans sa globalité. Je t'ai donné un code fonctionnel inspiré de celui que tu as fourni.
    Tout ce que tu indiques c'est que tu "n'arrives pas à afficher les points". Donne un bout de code fonctionnel que l'on puisse tester et voir pourquoi le chart ne trace pas la courbe.

    le voila mon code , tu cliques sur start pour demarer le timer , merci pour toi
    Wfa_ppi_06_05_2019.zip

  12. #12
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Ok, c'est un peu normal que ça ne fonctionne pas.
    Dans un premier temps, fais du ménage dans ton code :
    Rapidement et à la volée :
    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
     
    //C'est quoi ce UserControl1 ?
    UserControl1 objchart = new UserControl1();
     
    // Ici, nouvelle instance de Chart2
    Chart2 objchart2 = new Chart2();
     
    // Que tu utilises dans le timer :
    objchart2.loadchart_accX_Y_Z();
    objchart2.loadchart_accX_Y_Z_Col3();
     
    // Mais pas à l'affichage :
    panelBody.Controls.Add(Chart2.chart2); //(singleton)
     
    //Donc celui mis à jour n'est pas celui qui est affiché
    De plus je t'ai fait un joli code pour te montrer comment initialiser ton Chart et qui t'indique qu'il ne faut pas instancier l'objet Random à chaque mise à jour mais manifestement ça n'a pas servi ;-)

    Je ne vais pas corriger ton code, c'est un peu trop spaghetti à mon gout. Fait un gros ménage, sépare les choses pour pouvoir tester unitairement tes composants et tu verras que ça ira mieux.

    Bon courage !

  13. #13
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 15
    Par défaut
    j'ai refais un nouveau code propre, j’espère qu'il est plus lisible .
    Codetest_10_05_20199.zip

  14. #14
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Moafandi Voir le message
    tu peux me détailler un peu stp
    En fait je viens de voir ton projet exemple et j'avais mal compris ton problème. Ebastien est effectivement sur la bonne voie, suis ses conseils.

  15. #15
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Ok, j'ai regardé ton projet. C'est beaucoup mieux ! On y voit quelque chose ce coup-ci.
    C'est toujours normal que ça ne fonctionne pas mais tu touches le bon bout.
    Il y a un truc qui ressort dans ton code c'est l'utilisation des instances de classe qui te perturbe un peu manifestement. Par exemple tu utilises une instance de la classe _6dof pour calculer tes points et les insérer dans ton datagrid de home ... Et comme pour afficher ces points dans Chart tu as besoins de cet objet, tu en crées une nouvelle instance. Donc tu as deux instances d'une même classe chacune avec ses propriétés propres.
    Pareil pour le Chart. Tu as besoin d'utiliser ce UserControl à 2 endroits dans ton code donc tu crées deux instances...
    La question que tu dois te poser est : Qui à besoin de ces deux objets (instances de classe), Qui crées ces instances.
    Réponse :
    - Qui a besoin d'une instance de _6dof (personne car cette classe est assez mal foutue): dans ton projet c'est Chart et Home
    - Qui connait à la fois Chart et Home : Form1 car Form1 a un bouton pour afficher Chart et un bouton pour afficher Home.

    Donc Form1 peut créer une instance de _6dof et la transmettre à Chart et Home ! Donc Home n'a pas à connaitre Chart. C'est Form1 qui transmettra la donnée aux deux composants et donc en toute logique devra avoir le timer.

    C'est la même chose pour Chart. Ce n'est pas parce que tu ne l'affiches pas qu'il ne doit pas prendre en compte les points. Or ici tu crée une instance de Chart dans Home et une dans Form1.
    Ensuite Home transmet à son chart le point mais c'est le Chart de Form1 qui est affiché....

    Ce que tu peux faire c'est conserver quelque part une liste de points à afficher et transmettre cette liste à Chart au moment de son affichage.

    Pour résumer :

    Dans ton projet on a :

    Form1
    => Home
    => _6dof objsexdof
    => Chart1 objchart
    => Timer
    => Chart1.chart1
    => _6dof objsexdof2

    Ce que je te conseille (pour ne pas casser tout ton code)

    Form1
    => Home
    => Chart1
    => _6Dof
    => Timer
    Donc :
    - La classe _6dof : Tu la renommes en autre chose car son nom ne veut rien dire. Elle servira à stocker les points (elle comportera une liste de point) et tu supprimes la méthode FillMainTable(...) de cette classe, elle doit être dans Home. 6Dof ne connait pas Home !! Elle peut avoir une méthode qui calcule les points (ou les récupère) et les retourne et un moyen pour stocker ses points (Liste<>)
    - La Class Home : Implémente FillMainTable(...) et reçoit toutes les secondes le nouveau point à ajouter dans son tableau
    - La Classe chart : C'est pareil que Home mais au lieu d'afficher sous forme de table elle affiche sous forme de graphique. Mais leur fonction est similaire (2 usercontrols qui affichent les mêmes données sous deux formes différentes)
    - La Classe Form1 qui manage tout ça : Création des UserControl, de l'instance de la classe 6Dof qui calcule les points et les stockes, du Timer qui va intérroger la classe 6Dof pour obtenir un nouveau point et transmettre à Home et Chart les points à afficher.

    Enfin dernière chose : Renomme tes classes car Form1 et _6Dof c'est franchement pas terrible ;-)

    Ca peut te paraître compliqué à première vue mais c'est juste du déplacement d'un peu de code. Tout est là, il faut juste réorganiser un peu afin d'éviter de se perdre...

    Désolé pour le roman mais avec ça je pense que tu devrais t'en sortir.

    Bon courage tu y es presque !

Discussions similaires

  1. UserControl : Arrière plan
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 07/02/2008, 18h46
  2. [VB6] centrer l'image d'arrière-plan de ma Form ?
    Par ghohm dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/04/2004, 01h58
  3. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  4. comment stoper 1 thread d'arrière-plan
    Par ms91fr dans le forum Langage
    Réponses: 3
    Dernier message: 06/06/2003, 17h46
  5. changer l'image d'arrière plan du bureau
    Par etenclin dans le forum MFC
    Réponses: 7
    Dernier message: 22/08/2002, 15h54

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