Bien le bonsoir,
je suis étudiant en deuxième année de BTS IRIS, et je viens donc poster mon premier message sur ce forum pour venir chercher de l'aide à mon problème.
Je dois d'ici la fin de l'année, pour mon diplôme, coder la simulation de capteurs et d'actionneurs pour une maquette de traitement de surface qui n'en possède donc pas. Ayant découvert l'usine à gaz qu'est Visual Studio, j'ai décider de lâcher mon vieux Borland c++ v6 (), et de m'attaquer au .NET de Microsoft.
Etant un fervent utilisateur du c++, j'ai commencé avec une "solution" (comme ils disent) en c++/cli.
Au début, tout allait bien, le côté "managé" du .NET ne me dérangeait pas plus que ça, je m'y suis fait assez rapidement (avec une aide précieuse de vos FAQ ).
Et là, c'est la cata', il me fallait utiliser une certaine dll pour communiquer avec le module (Labjack pour ceux qui connaissent) qui me relie à la maquette: le mélange de type natifs et managés dans les mêmes classes m'a donné du fil à retordre,au point où j'ai décider de passer en C#.
Et à mon grand étonnement, plus de problème, la dll version .NET du Labjack était encore plus simple d'utilisation, problème résolu ...
Ou presque
Comme je l'ai préciser plus haut, vos FAQ m'ont beaucoup aidées, et surtout en ce qui concerne les threads et les delegate.
La syntaxe étant à peine différente du c++/cli, j'ai eu aucune peine à faire la transformation.
Mon premier test consiste donc à mettre à jour un pauvre petit label selon si j'arrive, oui ou non, à établir une connexion au module Labjack, et tout cela depuis un thread.
Cela marche parfaitement une, deux, trois, ... x fois. En raccourcissent un peu le code à chaque fois, me rendant compte de quelques lignes inutiles ou ne me servant plus.
Puis arrive le moment fatidique, après un nouveau test sur ce même thread, qui a fonctionner. J'ai voulu modifié la visibilité de la déclaration de mon delegate (protected à public) car le compilo me crié dessus (un avertissement et pas une erreur)pour mettre la même visibilité à la déclaration de mon type delegate et à la déclaration du delegate (les deux en public). J'effectue donc la modification, je relance mon application et là, c'est le "drame". Le thread ne fait plus son boulot, le label ne se met plus à jour.
J'ai tout de suite remodifier la précédente manip', pour retrouver au caractère près un code qui avait fonctionner, il y a un build de cela.
Mais plus rien n'y fait, j'ai beau bidouiller dans tout les sens, rajouter des Console.WhriteLine() de partout pour voir où ça clochait. J'ai même recommencer un nouveau projet, en effectuant un copier/coller de mes fichiers, au cas où un fichier de configuration, quelque part, ne se serait pas endommagé ou autre ...
Le label ne se met toujours pas à jour et je commence à péter un câble
Je vous en serait reconnaissant de bien vouloir m'aider, voici les morceaux de code concernés.
TdsForm.cs
TdsThread.cs
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
77
78
79
80
81 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TdsSimulation { public partial class TdsForm : Form { /* --------------------------------------------------------------*/ /* ------ Attributs ---------------------------------------------*/ private TdsThread paramThread; private Thread Connexion; //private Thread CapteursTemperature; //private Thread CapteursNiveau; public delegate void errorLabelDelegateHandler(int error); public errorLabelDelegateHandler errorLabelDelegate; /* --------------------------------------------------------------*/ /* ------ Constructeur et Destructeur ---------------------------*/ public TdsForm() { InitializeComponent(); this.paramThread = new TdsThread(this); } /* --------------------------------------------------------------*/ /* ------- Méthodes des composants graphiques -------------------*/ private void connectionButton_Click(object sender, EventArgs e) { this.Connexion = new Thread(new ThreadStart(this.paramThread.Open)); this.Connexion.Start(); Thread.Sleep(3000); } /* --------------------------------------------------------------*/ private void modeButton_Click(object sender, EventArgs e) { // this.CapteursTemperature = new Thread(new ThreadStart(this.paramThread. } /* --------------------------------------------------------------*/ private void modeComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (this.modeComboBox.SelectedIndex == 0) this.modeLabel.Text = "Aucune intéraction n'est \npossible sur le système."; if (this.modeComboBox.SelectedIndex == 1) this.modeLabel.Text = "Vous pouvez intéragir sur \nles capteurs et les actionneurs."; } /* --------------------------------------------------------------*/ /* ------- Méthodes des delegate --------------------------------*/ public void updateErrorLabel(int error) { try { if (error == 0) { this.errorImg.Image = global::TdsSimulation.Properties.Resources.erreur1; this.errorLabel.Text = "Connexion au\n labjack réussie"; throw new Exception("Modification réussie."); } if (error == 1) { this.errorImg.Image = global::TdsSimulation.Properties.Resources.erreur0; this.errorLabel.Text = "Erreur lors \nde la connexion"; throw new Exception("Modification non réussie."); } } catch (Exception e) { Console.WriteLine(e); } } /* --------------------------------------------------------------*/ } }
TdsLabjack.cs
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 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TdsSimulation { class TdsThread { /* --------------------------------------------------------------*/ /* ------ Attributs ---------------------------------------------*/ private TdsLabjack myLJ; private TdsForm myPtr; /* --------------------------------------------------------------*/ /* ------ Constructeur et Destructeur ---------------------------*/ public TdsThread(TdsForm ptr) { this.myLJ = new TdsLabjack(); this.myPtr = ptr; } /* --------------------------------------------------------------*/ /* ------- Méthodes ---------------------------------------------*/ public void Open() { try { if (this.myLJ.Connection()) { Console.WriteLine("Connection réussie"); this.myPtr.Invoke(this.myPtr.errorLabelDelegate, 0); throw new Exception("Après réussite."); } else { Console.WriteLine("Connection échec"); this.myPtr.Show(); this.myPtr.Invoke(this.myPtr.errorLabelDelegate, 1); throw new Exception("Après l'erreur."); } } catch (Exception e) { Console.WriteLine(e); Console.WriteLine("Connection echec"); } } /* --------------------------------------------------------------*/ } }
Merci d'avoir pris le temps de lire mon pâté où je raconte ma vie, et n’hésitez pas à me demander certains détails qu'y vous aurez peut être échappés.
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 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using LabJack.LabJackUD; namespace TdsSimulation { class TdsLabjack { /* --------------------------------------------------------------*/ /* ------ Attributs ---------------------------------------------*/ private int LJ_Handle; /* --------------------------------------------------------------*/ /* ------ Constructeur et Destructeur ---------------------------*/ public TdsLabjack(){...} /* --------------------------------------------------------------*/ /* ------- Méthodes ---------------------------------------------*/ public bool Connection() { try { LJUD.OpenLabJack(LJUD.DEVICE.U3, LJUD.CONNECTION.USB, "", true, ref this.LJ_Handle); return true; } catch (LabJackUDException e) { Console.WriteLine(e); return false; } } /* --------------------------------------------------------------*/ public void Get_Orders(){...} /* --------------------------------------------------------------*/ public void Send_Values(int Temp, int Level){...} /* --------------------------------------------------------------*/ } }
En vous remerciant d'avance.
Cordialement o/
Partager