MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 28 févr. 2005 à 14:18
<!--StartFragment --> Attention, je crois qu'il y a eu confusion (ou incompréhension).
On reprend depuis qques messages en haut, ou tu me dis
Mon problème est comment je fais pour faire un return de ma struture dans la class motor_move ! Je suis embeté car j'utilise un thread... comment m'y prendre?
Ce que j'ai compris, c'est que tu aimerais que le Thread te retourne la structure. Pour ce faire, dans cette class (la classe contenant le Thread), tu déclares ton délégué et ton event.
Dans la fonction du Thread, (la ou tu aurais aimé faire un return), tu mets
Call_Axe(la structure que tu veux retourner);
Ensuite, depuis la classe depuis laquelle tu veux appeler ce Thread, il faut que ton objet inscrive l'évenement Call_Axe (ca ne se fait pas en instanciant)
Tiens, je t'ai fait un exemple concret, parce que sinon tu risques de galérer encore beaucoup (j'ai du mal a expliquer les choses ^^)
using
System;
using System.Threading;
namespace Test
{
public class ThreadClass
{
public delegate void MonEvent(MaStruct laStruct);
public event MonEvent monEvent;
public Thread t;
public MaStruct laStruct;
public ThreadClass(MaStruct laStruct)
{
t = new Thread(new ThreadStart(MethodeThread));
this.laStruct = laStruct;
}
public class CallingClass
{
MaStruct maStruct;
ThreadClass tc;
public CallingClass()
{
maStruct.str = "aaa";
Console.WriteLine("valeur de la structure avant lancement du thread " + maStruct.str);
tc = new ThreadClass(maStruct);
tc.monEvent += new Test.ThreadClass.MonEvent(tc_monEvent);
tc.StartThread();
}
private void tc_monEvent(MaStruct laStruct)
{
maStruct = laStruct;
Console.WriteLine("valeur de la structure apres lancement du thread " + maStruct.str);
Console.ReadLine();
}
public static void Main()
{
CallingClass c = new CallingClass();
}
}
Si cela ne résoud pas ton probleme, alors il faudra nous donner le code de toutes les classes incriminées, ou alors reprendre depuis le début ce qu'il ne va pas, sinon on va tourner en rond ;)
bip98
Messages postés104Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention29 avril 20081 28 févr. 2005 à 10:19
encore un problème..
motor_move move = new motor_move(this.motor_struct_class);
Time_break_motor_X = new Thread(new ThreadStart(move.axe_x));
donc la j'envoie la strucutre motor_struct_class
et j'appel ma class.
dans ma classe:
private class motor_move
{
private Test_moteur.f_moteur.struct_motor motor_struct_class;
int[] v_moteur = new int[4];
public motor_move(Test_moteur.f_moteur.struct_motor structure_config)
{
this.motor_struct_class=structure_config;
}
Mon problème est comment je fais pour faire un return de ma struture dans la class motor_move ! Je suis embeté car j'utilise un thread... comment m'y prendre?
(encore juste une question bete: comment fait-on pour tester une décimal ? --> par exemple je voudrais tester :est-ce que 7.23 est plus grand que .5 ou plus petit .5 --> dans ce cas plus petit..)
Vous n’avez pas trouvé la réponse que vous recherchez ?
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 28 févr. 2005 à 10:26
Je suis pas sur d'avoir compris, mais je te dirais que tu dois pouvoir utiliser les délégués pour retourner ta struct.
Renvoyer des données depuis un thread est une question assez recurrente
sur le site, tu dois pouvoir trouver pas mal de chose la dessus comme
ici : http://www.csharpfr.com/forum.v2.aspx?ID=373183
Pour comparer ton Decimal, tu as la méthode tonDecimal.CompareTo(); ou la méthode static Decimal.Compare();
bip98
Messages postés104Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention29 avril 20081 28 févr. 2005 à 13:34
Alors je résume:
Je déclare:
//Déclaration du delegate
public delegate void CallAxeEvent(Test_moteur.f_moteur.struct_motor structure_config); //De event..
public event CallAxeEvent Call_Axe;
Puis dans ma classe:
//La stucture s'appel this.motor_struct_class dans ma class.
CallAxeEvent MoveAxe = new CallAxeEvent(motor_move.AxeXY);
this.motor_struct_class.v_pas=48;
this.motor_struct_class=MoveAxe(this.motor_struct_class); //Appel de l'autre class.
Ensuite dans mon autre class qui est : motor_move.AxeXY :
private class motor_move
{
private Test_moteur.f_moteur.struct_motor motor_struct_class;
public static void AxeXY(Test_moteur.f_moteur.struct_motor structure_AxeXY)
{
structure_AxeXY.v_pas =96;
Call_Axe(structure_AxeXY); //Pour le return..
}
}
Voilà le compilateur me marque les erreurs sont en rouge:
[C# Erreur] Motor_class.cs(24): Impossible de convertir implicitement le type 'void' en 'Test_moteur.f_moteur.struct_motor'
[C# Erreur] Motor_class.cs(61): Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'Axe_move.Call_Axe'
bip98
Messages postés104Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention29 avril 20081 28 févr. 2005 à 16:43
Encore juste un petit problème ! Mais beaucoup moins compliqué !
Toujours dans un retour,
Je veux revoyé ma stucture, mais je veux qu'il la renvoie quand v_end==true;
Alors le code:
public class Axe_move
{
//Attribu
private Test_moteur.f_moteur.struct_motor motor_struct_class;
public Test_moteur.f_moteur.struct_motor gauche(Test_moteur.f_moteur.struct_motor structure_config)
{
if(this.motor_struct_class.v_end==true)
{
return this.motor_struct_class; //Donc je retourne ICI ma stucture
}
}
Le problème : c'est que le compilateur me dit:
Axe_move.gauche(Test_moteur.f_moteur.struct_motor)' : tous les chemins de code ne retournent pas nécessairement une valeur
...B'en oui...ca compile si j'enleve le if... mais il faut qu'il envoie tant qu'il a pas eu la confirmation.. Comment faire ?
bip98
Messages postés104Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention29 avril 20081 28 févr. 2005 à 17:05
Le problème c'est que les valeurs qui m'interesse arrive 2-3 secondes après qu'il soit passé au return.. le "true" était une confirmation que les valeurs etait bien initialisées !