Thread c#

Résolu/Fermé
mordoke Messages postés 2 Date d'inscription mercredi 11 mai 2016 Statut Membre Dernière intervention 12 mai 2016 - Modifié par mordoke le 11/05/2016 à 16:30
mordoke Messages postés 2 Date d'inscription mercredi 11 mai 2016 Statut Membre Dernière intervention 12 mai 2016 - 12 mai 2016 à 18:25
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 méthode CodeurValeurAfficheur sera elle aussi mise en thread.
J'ai déjà suivie plusieurs tuto et astuce, mais impossible de faire fonctionner

Classe Capteur.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Peak.Can.Basic; // bibliotheque pcan
using variateur;
using TPCANHandle = System.Byte;

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Peak.Can.Basic;
using variateur;
using System.Threading;
using System.Threading.Tasks;
using TPCANHandle = System.Byte;

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using Peak.Can.Basic; // bibliotheque pcan

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()));

1 réponse

mordoke Messages postés 2 Date d'inscription mercredi 11 mai 2016 Statut Membre Dernière intervention 12 mai 2016
12 mai 2016 à 18:25
Le problème est maintenant résolu.

Changement apporté :

-------
Classe capteur

 public void codeurvaleur(object capteur)
{
while (Thread.CurrentThread.IsAlive)
{
Capteur grid = (Capteur)capteur;
if ((grid.ValeurcapteurFinal != 0))
{
// Code méthode
}
else
{
Console.WriteLine("ValeurcapteurFinal incorrecte !");
}
}
}


-----------
Main

#region Codeur  
Codeur CODEUR = new Codeur("Codeur variateur", 1); // numero du noeud (1)
bool retour4 = false;
//initialiser la première interface usb/can avec un baurate de 250 kBit/sec
retour4 = CODEUR.configurer((byte)PCANBasic.PCAN_USBBUS1, TPCANBaudrate.PCAN_BAUD_250K);
//TPCANHandle 0x51->PCAN-USB interface, channel1 PCAN_BAUD_250K -> 250 kBit/s
if (retour4)
Console.WriteLine("configuration réussie");
else
Console.WriteLine("echec de la configuration");
#endregion


Thread.Sleep(5000);

#region Boucle Codeur-Afficheur)
Console.WriteLine("Lancement boucle");

// Create the thread object, passing in the (CODEUR.codeurvaleur) method
// via a ThreadStart delegate. This does not start the thread.
var CodeurBoucle = new Thread(new ParameterizedThreadStart(CODEUR.codeurvaleur));
//Start the thread
CodeurBoucle.Start(CAPTEUR);
0