begin process at 2012 02 08 21:18:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C#

 > 

Archives

 > 

Au secours

 > 

passage par référence


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

passage par référence

vendredi 5 août 2005 à 16:28:41 | passage par référence

neoTHGLF

Bonjour,
je travaille actuellement sur une programme à la con afin de m'initier au C#. Venant du C++, l'adaptation n'est pas trop dure.
Mon problème est le suivant :
Je dispose de deux classes :

using System.Windows.Forms;
using System.Threading;
public class calcul_pos_x //Sert à caculer la position de la souris sur l'axe x de l'écran
{
private double total;
private Label affichage_texte;

public calcul_pos_x(ref double tot,ref Label label) //Constructeur
{
total = tot;
affichage_texte = label;
}
}

public class calcul_pos_y //Sert à caculer la position de la souris sur l'axe y de l'écran
{
private double total;
private Label affichage_texte;

public calcul_pos_y(ref double tot,ref Label label) //Constructeur
{
total = tot;
affichage_texte = label;
}
}

Donc le constructeur de chacune de ces deux classe prends comme parametres deux références.
Ces deux classes intègrent de plus, chacune une méthode. On obtient donc :

using System.Windows.Forms;
using System.Threading;
public class calcul_pos_x //Sert à caculer la position de la souris sur l'axe x de l'écran
{
private double total;
private Label affichage_texte;

public calcul_pos_x(ref double tot,ref Label label) //Constructeur
{
total = tot;
affichage_texte = label;
}

public void calculate()
{
while(true)
{
System.Threading.Thread.Sleep(1);
mouse_pos_x = MousePosition.X; /* Obtient la position actuelle de la souris sur l'axe x */
if (mouse_pos_x != tmp_x)
{
double sub;
sub = (Math.Abs(mouse_pos_x - tmp_x)) / 96; /* Calcul la distance parcourue par la souris sur l'écran en pouces */
total += sub * 2.54; /* Convertit la distance en Centimetre et l'ajoute à total */
affichage_texte.Text = total.ToString();
affichage_texte.Refresh();

}
tmp_x = mouse_pos_x;
}
}

}

public class calcul_pos_y //Sert à caculer la position de la souris sur l'axe y de l'écran
{
private double total;
private Label affichage_texte;

public calcul_pos_y(ref double tot,ref Label label) //Constructeur
{
total = tot;
affichage_texte = label;
}

public void calculate()
{

while(true)
{
System.Threading.Thread.Sleep(1);
mouse_pos_x = MousePosition.Y; /* Obtient la position actuelle de la souris sur l'axe y */
if (mouse_pos_y != tmp_y)
{
double sub;
sub = (Math.Abs(mouse_pos_y - tmp_y)) / 96; /* Calcul la distance parcourue par la souris sur l'écran en pouces */
total += sub * 2.54; /* Convertit la distance en Centimetre et l'ajoute à total */
affichage_texte.Text = total.ToString();
affichage_texte.Refresh();

}
tmp_y = mouse_pos_y;
}
}
}

La méthode Calculate() intégrée aux deux classes sert à calculer en centimètres la distance que la souris à parcourue sur l'écran.
Lorsque le cacul est terminé, le résultat est stocké dans un double, celui qui a été passé par référence au constructeur lors de la création de l'objet dans une Form que voici :

public Form1()
{
double distance_parcourue;
Label label1 = new Label();


calcul_pos_x calculator_x = new calcul_pos_x(ref distance_parcourue,ref label1);
calcul_pos_y calculator_y = new calcul_pos_y(ref distance_parcourue,ref label1);

Thread x_thread = new Thread(new ThreadStart(calculator_x.calculate));
Thread y_thread = new Thread(new ThreadStart(calculator_y.calculate));

x_thread.Start();
y_thread.Start();

}

Donc, lorsque la Form1 est chargée, deux thread sont créés, un pour calculer la distance sur x et l'autre la distance sur y.
Normalement durant l'éxécution des deux thread, la variable double distance_parcourue devrait augmenter.
Lorsque je déplace la souris sur l'axe X de l'écran, distance_parcourue augmente bel et bien.
De même, lorsque je déplace la souris sur l'axe Y.

Alors quel est le probleme ? vous demandez-vous.
Le probleme c'est que par exemple si je me déplace sur l'axe X de 20 centimètres, alors distance_parcourue est égal à 20, si je continue sur le même axe à me déplacer de 5 centimètres, alors, distance_parcourue égal 25.
Maintenant, je décide de me déplacer de 10 centimètres sur l'axe Y, et bien là, au lieu d'être égal à 35, distance_parcourue égal 10.
En revanche si je décide de ma redéplacer sur l'axe X de 5 centimètres(par exemple), alors distance_parcourue est égal à 30, ce qui est tout à fait logique.
Maintenant je me redéplace de 40 sur l'axe Y, et bien distance_parcourue égal 50.
Ainsi, au lieu d'additionner la distance parcourue sur les deux axes, le programme semble additionner d'un coté la distance parcourue par la souris sur l'axe Y, et de l'autre coté, la distance parcourue sur l'axe Y, comme s'il existait 2 variables... je ne comprends pas d'où ça vient. Enfin, je suis presque sûr que ça vient du passage par référence, mais je ne comprends pas pourquoi.

Quelqu'un aurait - il une suggestion ? (s'il vous plait je vous en suplis, ça va faire plus de 4 heures que je suis sur ce probleme, plus une heure de rédaction de ce post) ;).
Cordialement.



vendredi 5 août 2005 à 16:55:21 | Re : passage par référence

Lutinore

Administrateur CodeS-SourceS

Salut,





1 ) pourquoi passer le label par ref, c'est déja un type référence !?
2 ) http://www.csharp.fr/tutorial.aspx?ID=174 ( Cross-threading )
3 ) Concurrence des thread peut être ? opérateur lock !

vendredi 5 août 2005 à 17:18:03 | Re : passage par référence

neoTHGLF

Bonjour,

1) si je ne passe pas le label par référence, je ne peux pas y accèder à partir de la méthode Calculate(), peut-être que je fais une erreur quelque part.
2) j'ai lu mais j'ai du mal à comprendre en quoi ça résoud mon problème
3) Je suis débutant, je t'avouerais que ça fait un peu trop longtemps maintenant que je galère, pour avoir le courage d'essayer de comprendre de vagues explications

est ce que tu pourrais être plus clair ?
Cordialement.



samedi 6 août 2005 à 18:58:54 | Re : passage par référence

Bidou

Administrateur CodeS-SourceS
Réponse acceptée !

Salut,
Ton problème est le suivant : tu veux résoudre quelque chose d'extrêmement simple en faisant compliqué. Pourquoi créer pleins de classes, de méthodes, de passages par références, passer des Labels d'un coin à un autre, ect. ?

J'ai très très rapidement écrit un code qui fonctionne. Je n'ai construit aucune classe, ce qui n'est pas forcément la meilleure approche, à toi de l'adapter (je te propose de créer une class qui intégre le code si dessous, et de faire une méthode ou Property qui get la valeur total du chemin effectué par la souris depuis que le programme est démarré (évidemment, quand on parle de chemin total, on parle de la distance de l'abscisse aditionnée à celle de l'ordonnée, ce qui n'est pas vraiment la distance totale... mais faisons simple pour commencer) :

private int tot = 0;
private int xLast = 0;
private int yLast = 0;

public void Cal()
{
while (true)
{
int x = Control.MousePosition.X;
int y = Control.MousePosition.Y;
tot += Math.Abs(x-xLast) + Math.Abs(y-yLast);
xLast = x;
yLast = y;
// Ici à faire : Mise à jour du Label de manière asynchrone pour éviter le cross-threading
System.Threading.Thread.Sleep(10);
}
}

Bien entendu, cette méthode doit être démarrée dans un nouveau Thread.
Exemple :

System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(this.Cal));
t.Start();

Voilà c'est tout...



[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever

dimanche 7 août 2005 à 00:20:56 | Re : passage par référence

neoTHGLF

Merci beaucoup pour cette réponse, j'ai entre temps trouvé une solution à mon probleme en utilisant justement des variables globales. Seulement à la base je préférais éviter les variable globales. Un lointain souvenir me dit qu'il est plutôt déconseillé de les utiliser. J'avais aussi créé deux threads parce que les calculs étaient lourd et que le programme freezait.
La solution que j'ai mise au point est exactement celle que vous venez de me conseiller, à une différence près ; j'ai un thread qui calcul la distance sur x et un autre qui calcule la distance sur y.

Merci à tous les deux pour vos réponses.
Cordialement.
dimanche 7 août 2005 à 11:19:23 | Re : passage par référence

Bidou

Administrateur CodeS-SourceS
Ca dépend de ce qu'on entend par "variables globales". En C# les variables globales à une application n'existent pas réellement. En loccurance, les variables

private int tot = 0;
private int xLast = 0;
private int yLast = 0;

que j'ai déclaré sont des variables de classes qui sont de plus privées, ce qui ne posent aucun problème de sécurité... On peut donc les utiliser sans aucun soucis.
Sinon à propos des Threads, ça me paraît un peu inutile d'en créer deux étant donné la faible charge de travail que demande les instructions tournant en boucle dans le while... mais bon, c'est un peu un détail !



[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever


Cette discussion est classée dans : label, axe, distance, pos, parcourue


Répondre à ce message

Sujets en rapport avec ce message

Distance parcourue par la souris [ par sevenace ] Bonjour,Ma question est très simple: Existe t-il un moyen simple de calculer la distance parcourue par la souris? Et pour passer des PIXELS en CM ou M [c#]Changer la taille de la police d'un label [ par scove ] Bonjour, Je suis en train de faire un petit projet en C# (sous sharpDevelop) et j'aimerais que l'utilisiteur puisse modifier l'interface à sa convena couleurs de polices différentes dans un label [ par fred65200 ] bonsoir à tous. je cherche à mettre 3 couleurs de police dans un label. le texte est sur trois lignes. les lignes sont separees par \n la premiere lig Accès a la propriété Text d'une TextBox dynamique [ par bgcode ] private void button2_Click(object sender, EventArgs e)         {             nb=nb_champs.Text; User control avec Label et DataGrid [ par ajan ] Salut !Je fais actuellement un site qui permet d'acéder facilement à une base de données. Le souci, c que dnas des recherches multicritères, je ne peu Sortir d'un Label [ par fredspv ] Bonjour,Je n'arrive pas à Recuperer le nom du Label perdant le focus, le code suivant fait planter l'appli: ((Label)sender).Name.ToString()Merci de vo Lancer une apllication a distance [ par hoymille ] Bonjour,Est-il possible de lancer automatiquement (par envoi d'un message) une application fait en C# à distance (sur un autre pc du réseau)?Si oui, p copier un fichier à distance [ par zrelli ] zrellije cherche une solution pour copier un fichier à distance à partir en utilisant .net ? Retour à la ligne dans un label [ par zigxag ] Bonjour !quel est le caractère qui permet de revenir à la ligne dans un Label ? J'ai essayé '\n' mais ca ne marche pas...Merci ! Affichage absent [ par RegVB ] Bonjour, Je rencontre un problème d'affichage d'un Label dans une Windows Form : je désire rendre un label visible durant un traitement relativement l


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,430 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales