Problème thread programme
bonjour à tous, je rencontre des difficultés pour mettre en place des thread pour ma méthode codeurvaleur de la classe Codeur afin que celui-ci tourne quand il est appelé.
Plus tard, la valeur fournit par codeurvaleur sera afficher par un afficheur lui aussi tournant en boucle avec un thread tout les 0.5 seconde voir 1 seconde. Les méthode doivent pouvoir tourner tous les 0.5 secondes en fond sans gêner d'autre tâche et lancer d'autre méthode ...
J'ai déjà suivie plusieurs tuto et astuce, mais impossible de faire fonctionner.
-----------------------------------------------------------------------------------------
Classe Capteur.cs
Code:
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
| namespace Capteur
{
class Capteur : noeud_can
{
private int ValeurCapteurFinal;
public int ValeurcapteurFinal
{ get { return ValeurCapteurFinal; } }
//constructeur par defaut
public Capteur(string nom_peripherique, UInt16 numero_noeud)
: base(nom_peripherique, numero_noeud)
{
}
public void capteurvaleur()
{
//COB ID
uint COB_ID_emission_sdo = (uint)0x600 + numero_noeud;
uint COB_ID_reception_sdo = (uint)0x580 + numero_noeud;
Console.WriteLine("debut de la capture");
// Envoie de la trame pour lire l'entrée analogique numéro 2 du variateur
// 0x40 - Read Request = requête de lecture d'un paramètre du variateur
// 5fe3 - affichage de la tension d'entrée aux entrées analogiques
// plage d'affichage du capteur : -10.00 a +10.00
// 0x02 - tension d'entrée AIN2
envoyer_trame(COB_ID_emission_sdo, 8, 0x40, 0xe3, 0x5f, 0x02, 0x0, 0x0, 0x0, 0x0);
Console.WriteLine("\nenvoi de la trame de lecture de la valeur d'entrée");
Thread.Sleep(100);
//Trame réponse du variateur
//recevoir_trame(COB_ID_reception_sdo, 8);
TPCANMsg message_reponse;
message_reponse = recevoir_trame(COB_ID_reception_sdo, 8);
Thread.Sleep(100);
#region conversion
string disthexa = message_reponse.DATA[5].ToString("X");
string disthexa2 = disthexa + message_reponse.DATA[4].ToString("X");
int intAgain = int.Parse(disthexa2, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(intAgain);
int ValeurDivision = (intAgain * 2);
this.ValeurCapteurFinal = (ValeurDivision / 10);
Console.WriteLine("La distance est de {0} mm", this.ValeurCapteurFinal);
/*int ValeurTraitement = (ValeurDivision / 10);
Console.WriteLine("La distance est de {0} mm", ValeurTraitement);*/
#endregion
}
}
} |
---------------------------------------------------------------------------------------------
Classe Codeur.cs
Code:
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
| namespace Codeur
{
class Codeur : noeud_can
{
private int ValeurCodeurFinal;
public int ValeurcodeurFinal
{ get { return ValeurCodeurFinal; } }
//constructeur par defaut
public Codeur(string nom_peripherique, UInt16 numero_noeud)
: base(nom_peripherique, numero_noeud)
{
}
public void codeurvaleur(Capteur capteur)
{
//var grid = (Capteur)capteur;
if ((capteur.ValeurcapteurFinal != 0))
{
//Console.WriteLine("ValeurCapteur{0}", capteur.ValeurcapteurFinal);
//Console.ReadKey();
//COB ID
uint COB_ID_emission_sdo = (uint)0x600 + numero_noeud;
uint COB_ID_reception_sdo = (uint)0x580 + numero_noeud;
Console.WriteLine("debut de la capture");
//Envoie de la trame pour lire l'entrée analogique numéro 2 du variateur
//0x40 - requête de lecture d'un paramètre du variateur 64 en décimal 4 octets
//5cbd - affichage de valeurs d'entrée 32 bits de différents blocs en [incréments]
// plage d'affichage du capteur : -2147483647 a +2147483647
// 0x5 - sous index 5 MCTRL: dn PosSetValue_p
envoyer_trame(COB_ID_emission_sdo, 8, 0x40, 0xbd, 0x5c, 0x05, 0x0, 0x0, 0x0, 0x0);
Console.WriteLine("\nenvoi de la trame de lecture de la valeur d'entrée");
Thread.Sleep(100);
//Trame réponse du variateur
//recevoir_trame(COB_ID_reception_sdo, 8);
TPCANMsg message_reponse;
message_reponse = recevoir_trame(COB_ID_reception_sdo, 8);
Thread.Sleep(100);
#region Conversion valeur codeur
string disthexa = message_reponse.DATA[7].ToString("X2");
string disthexa2 = disthexa + message_reponse.DATA[6].ToString("X2");
int intAgain = int.Parse(disthexa2, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(intAgain);
int tour = (intAgain); // Mise a l'échelle : 65535 = 1 tour
double tourcodeur = (tour * 0.2);
Console.WriteLine("Nombres de tours : " + tour);
Console.WriteLine("nombres de centimètre : {0}", tourcodeur);
#endregion
#region Valeur pour afficheur (calcule)
double ResultatCapteurCodeur = (capteur.ValeurcapteurFinal - tourcodeur);
this.ValeurCodeurFinal = Convert.ToInt32(ResultatCapteurCodeur);
Console.WriteLine("La distance restant est de {0} mm", ValeurCodeurFinal);
#endregion
}
else
{
Console.WriteLine("ValeurcapteurFinal n'a pas la bonne valeur !");
}
}
}
} |
---------------------------------------------------------------------------------------------
Programclasse.cs
Code:
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
| namespace Programme
{
class Programsansclasse
{
static void Main(string[] args)
{
#region Fonctionnement
#region Capteur
Capteur CAPTEUR = new Capteur("UPK 500 POR", 1);
#endregion
CAPTEUR.capteurvaleur(); //Fonctionnement du capteur
Thread.Sleep(5000);
#region Afficheur
Afficheur AFFICHEUR = new Afficheur("CA340", 2);
#endregion
AFFICHEUR.CapteurValeurAfficheur(CAPTEUR);
Thread.Sleep(5000);
#region Codeur
Codeur CODEUR = new Codeur("Codeur variateur", 1);
#endregion
Thread.Sleep(5000);
// Create the thread object, passing in the CODEUR.codeurvaleur(CAPTEUR) method
// via a ThreadStart delegate. This does not start the thread.
var CapteurBoucle = new Thread(new ParameterizedThreadStart(CAPTEUR.capteurvaleur()));
//Start the thread
CapteurBoucle.Start();
Thread.Sleep(50);
#endregion
Console.ReadKey();
}
}
} |
----------------------------------------------------
L'erreur produit est celle-ci:
Erreur 1 Nom de méthode attendu ...\....\Programclasse.cs 84 73 Afficheur-capteur
ligne de l'erreur :
var CapteurBoucle = new Thread(new ParameterizedThreadStart(CAPTEUR.capteurvaleur()));