Class, thread, Erreur.. [Résolu]

Signaler
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
-
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
-
voilà mon code:

class Axe_move
{
//Attribu
private int i;
int[] v_moteur = new int[4];


//Constructeur
public Axe_move()
{
//Moteur avant, droite, valeur des pas
this.v_moteur[0]=10+192;
this.v_moteur[1]=6+192;
this.v_moteur[2]=5+192;
this.v_moteur[3]=9+192;
}


//méthodes
public void gauche(int v_pas)
{
this.i=v_pas;
Thread Time_break_motor_X;
motor_move move = new motor_move();
Time_break_motor_X = new Thread(new ThreadStart(move.axe_x(this.i))); //ICI l'erreur
Time_break_motor_X.Start();
}


private class motor_move
{
int v_pas;
public void axe_x(int v_pas)
{
this.v_pas=v_pas;


}


}


}

J'ai une erreur de compilation.. je comprends pas.. c'est surement tout bête.
Il me marque: Nom de méthode attendu

15 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
en fait d'apres ce que je disais ton code deviendrais qqch comme ça :
class Axe_move
{
//Attribu
private int i;
int[] v_moteur = new int[4];
private motor_move move;

//Constructeur
public Axe_move()
{
//Moteur avant, droite, valeur des pas
this.v_moteur[0]=10+192;
this.v_moteur[1]=6+192;
this.v_moteur[2]=5+192;
this.v_moteur[3]=9+192;
}


//méthodes
public void gauche(int v_pas)
{
this.i=v_pas;
Thread Time_break_motor_X;
move = new motor_move();
Time_break_motor_X = new Thread(new ThreadStart(move.axe_x)); //ICI l'erreur
Time_break_motor_X.Start();
}


private class motor_move
{
int v_pas;
public void axe_x()
{
this.v_pas=v_pas;


}


}


}

Le tout maintenant est d'affecter ta valeur autrement, par une propriété par exemple.

Mais regarde du coté de la solution des delegates proposée par bucherb, ça me semble plus interressant dans ton cas. :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

public class Axe_move
{
//Attribu
private int i;
private form1.struct_motor motor_struct_class;
//méthodes
public void gauche(form1.struct_motor structure)
{
this.motor_struct_class=strucutre;
}

Il faut bien que tu lui dise ou aller chercher ta structure..

-------------------------
Trambert le vert
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
La méthode associé à ton delegate ThreadStart ne doit pas avoir de paramètre.
Sinon tu declares ton instance move locale à la méthode, ce n'est pas bon, declare la plutot en tant que membre de la classe Axe_move.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
Time_break_motor_X = new Thread(new ThreadStart(move.axe_x(this.i))); //ICI l'erreur

Pas d'argument pour la methode appelé par un thread.

Il faut faire autrement en passant par un wrapper par exemple

::|The S@ib|::
MVP C#.NET
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

... ou par un délégué... Qui te fait exactement la même chose qu'un Thread, à ceci prêt qu'il est entièrement géré par le framework, et que tu peux lui passer des paramètres.

-------------------------
Trambert le vert
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
C'est exact

::|The S@ib|::
MVP C#.NET
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
J'ai beaucoup de mal à comprendre ce vocabulaire technique !

Donc si j'ai bien compris, je ne peux pas passer de paramètre depuis mon thread.. Mais par contre je ne comprends pas comment faire pour passer le paramètre (en faisant différemment)..
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

Il faut que tu crée un délégué

private delegate void MonDelegate (object peuimporte);

et ensuite tu crée ta méthode

private void MaMethodeDelegate (object peuimporte)
{
SqlConnection.Open(); // etc......
}

Et pour l'éxecuter, tu fais dans ton code

new MonDelegate (MaMethodeDelegate).BeginInvoke (tonObjetPeuImporte,null.null);

A la place de "object peu importe" tu peux mettre le nombre de paramères qui te chante..

-------------------------
Trambert le vert
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

le point entre les 2 null est bien sur une virgule ;-) Ce serait cool de pouvoir éditer ses messages lol..

-------------------------
Trambert le vert
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
J'ai pas très bien compris pour les délégués ! J'ai trouvé une srouce sur:
http://www.csharpfr.com/code.aspx?ID=11492

Par contre la solution de M.Coq me semblait bien ! mais je l'ai pas trop compris ! Peux-tu me la reexpliquer ?
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

Un délégé c'est ce qui est utilisé pour gérer les évenements.

Donc quasiment de la même façon que tu crée un évenement, tu crée un délégué, la méthode qui va avec, et en utilistant MonDélégué.BeginInvoke ça va te créer un thread automatisé pour ta méthode.

-------------------------
Trambert le vert
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
J'ai encore une petite question, mais cette fois c'est avec un envoie d'une structure dans la class:

Dans mon Form1:

public struct struct_motor
{
public string port_dev;
public int last_value;
public int v_pas;
public bool v_end;
}

public struct_motor motor_config;

motor_config = new struct_motor;

---> envoie dans la class:
Axe_move motor_class = new Axe_move();
motor_class.gauche(motor_config);

Dans la Class Axe_move:

public class Axe_move
{
//Attribu
private int i;
private struct_motor motor_struct_class;


//méthodes
public void gauche(struct_motor structure)
{
this.motor_struct_class=strucutre;
}

Il y a une erreur car dans ma class le compilateur me dit:
Le type ou le nom d'espace de noms 'struct_motor' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Merci, ça marche !
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
Désolé de vous déranger encore une fois..


<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


J’ai un petit problème, je cherche depuis longtemps mais j’y arrive pas !!!





J’envoie une structure dans ma class.. Axe_move.gauche puis je voudrais reprendre cette


Structure et la renvoyer dans la class motor_move… mon problème est que j’arrive pas à l’envoyer à la class motor _move depuis Axe_move.gauche. Comment faire ?





Voilà mon code :

namespace Motor_class
{
public class Axe_move
{
//Attribu
private Test_moteur.f_moteur.struct_motor motor_struct_class;
//méthodes
public void gauche(Test_moteur.f_moteur.struct_motor structure_config)
{
this.motor_struct_class=structure_config;
Thread Time_break_motor_X;
motor_move move = new motor_move(this.motor_struct_class);
Time_break_motor_X = new Thread(new ThreadStart(move.axe_x));
Time_break_motor_X.Start();
}


private class motor_move
{


int v_pas;
int v_ind;
int[] v_moteur = new int[4];



public motor_move(????) //Je voudrais recevoire la structure motor_struct_class ici
{


//Moteur avant, droite, valeur des pas
this.v_moteur[0] =10+192;
this.v_moteur[1]=6+192;
this.v_moteur[2]=5+192;
this.v_moteur[3]=9+192;
}


public void axe_x()
{

for(int go=0 ; go<motor_struct_class.v_pas ; go++)
{
try
{
using (Task digitalWriteTask = new Task("DigitalWriteTask"))
{
// Create an Digital Output channel and name it.
digitalWriteTask.DOChannels.CreateChannel("Dev1/Port1","",
ChannelLineGrouping.OneChannelForAllLines);
// Write digital port data. WriteDigitalSingChanSingSampPort writes a single sample
// of digital data on demand, so no timeout is necessary.
DigitalSingleChannelWriter writer = new DigitalSingleChannelWriter(digitalWriteTask.Stream);
writer.WriteSingleSamplePort(true, (int)this.v_moteur[motor_struct_class.v_ind]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
v_ind++;
if(motor_struct_class.v_ind>3)
motor_struct_class.v_ind=0;
Thread.Sleep(0);
}
}
}
}
}
Messages postés
104
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
29 avril 2008
1
C'est bon j'ai trouvé... j'ai peut.etre posté un peu vite.. désolé !