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.