Plusieurs Threads

Signaler
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
-
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
-
Je suis en train de faire un jeu de billard avec un thread par boule.

Chaque boule doit s'endormir un temps bien différents en fonction de la force avec laquelle elle a été percutée, mais voilà toutes mes boules vont à la même vitesse (celle de la boule la plus lente).

Voici le soft:

private Boule [] tab_Boules;
private int nb_Max_Boules=16;
private int nb_Boules=0;
private Thread [] tab_Threads;

public Form1()
{
InitializeComponent();
ab_Boules=new Boule[nb_Max_Boules];
tab_Threads=new Thread[nb_Max_Boules];
}

//Fonction de debug qui crée les boules et les fait se deplacer
private void button1_Click(object sender, System.EventArgs e)
{
int taille =20+ rnd.Next(25);
int Force=rnd.Next(100);
if(nb_Boules<nb_Max_Boules)
{

tab_Boules[nb_Boules] = new Boule(taille,panel1,Force);

tab_Threads[nb_Boules] = new Thread(new ThreadStart(tab_Boules[nb_Boules].bouleMove));
//On démarre le thread.
tab_Threads[nb_Boules].Start();
nb_Boules++;
}
}

Voici ma Form principale.

Et voici ma classe Boule:

//Le constructeur
public Boule(int _Rayon, Panel panneau, int V)
{
this.Rayon = _Rayon;
this.panneau = panneau;
this.point = new Point(0,0);
int index = rnd.Next(_colors.Length);
color = _colors[index];
Vitesse=V;
}

//La méthode appelée par le thread
public void bouleEMove()
{
while(true)
{
lock(this.panneau)
{
this.EffaceBoule();
// Gestion des bordures.
if((this.point.X + this.ajoutX > this.panneau.Width-this.grandeur) || this.point.X + this.ajoutX < 0)
{ this.ajoutX = (-1) * this.ajoutX;
this.point.X += this.ajoutX;
}
else this.point1.X += this.ajoutX;

if((this.point1.Y + this.ajoutY > this.panneau.Height-this.grandeur) || this.point1.Y + this.ajoutY < 0)
{
this.ajoutY = (-1) * this.ajoutY;
this.point.Y += this.ajoutY;
}
else this.point1.Y += this.ajoutY;

Graphics g = this.panneau.CreateGraphics();
g.FillEllipse(color,new Rectangle(this.point.X, this.point.Y, this.Rayon, this.Rayon));
Thread.Sleep(Vitesse);

}
}
}

public void EffaceBoule()
{
Graphics g= this.panneau.CreateGraphics();
g.FillEllipse(Brushes.White,new Rectangle(this.point.X, this.point.Y, this.Rayon, this.Rayon));
}

Si quelqu'un sait pourquoi mes boules tourne pas chacune à sa vitesse, merci de me répondre.

1 réponse

Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Pourquoi on fait:
Thead.Sleep(1);

et non pas :
monThread.Sleep();

je pense que c'est pour cette raison que lorsque jefait Thread.Sleep(Vitesse) tous mes threads vont à la même vitesse...