Problème de Threading(); variable inchangée
Bonjour,
Je vous expose mon problème, j'ai un programme qui travaille avec deux thread. Le premier, sert à afficher des positions en temps réel sur une map, et le second écoute une variable ( dont la valeur initiale est à 0) à partir d'une web méthode, de telle façon à ce qu'un évènement soit enclenché lorsque cette variable passe à 1.
Le problème est que la variable ne veut pas passer à 1 !! ( Alors qu'elle le devrait, d'ailleurs si je travaille sans threading elle passe bien à 1, sous les même conditions).
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
int StillLookingFor=0;
public DrivingMode()
{
InitializeComponent();
Coord.ReadCoordinatesFromGPSSimulator2(DriverCoord);
monThread1 = new Thread(new ThreadStart(ListeningPedestrianThreading));
monThread2 = new Thread(new ThreadStart(CallPositionsThreading));
monThread2.Start(); // On lance le thread permettant l'affichage temps réel des positions.
monThread1.Start(); // On lance le thread de lecture d'évenements.
}
private delegate void ListeningPedestrianThreadingDelegate();
private void UpdateListenerPedestrian()
{
if (this.InvokeRequired)
{
this.Invoke(new ListeningPedestrianThreadingDelegate(UpdateListenerPedestrian));
return;
}
PickMeUp_Mobile_BusinessLayers.DrivingMode driving = new PickMeUp_Mobile_BusinessLayers.DrivingMode();
StillLookingfor = driving.WaitingForSomeoneAskingMe(idMotorist, ref idPedestrian);
// l'indicateur reste à 0!!
up.Text = "" + StillLookingfor.ToString();
if (StillLookingfor==1)
{
// Ce bloc n'est jamais exécuté car la variable reste à 0
monThread1.Abort(); // On stoppe le thread1
monThread2.Abort(); // On stoppe le thread2
StartTheSpeech(); // On appelle la méthode StartTheSpeech
}
}
private void StartTheSpeech()
{
txtSpeech.Enabled = true;
txtSpeech.Visible = true;
}
// Cette partie, concerne le thread qui fonctionne bien
// celui de l'affichage temps réel des positions, je le mets quand même
private void CallPositionsThreading()
{
if (nbr_position < 15)
{
UpdateCarPosition(nbr_position);
Thread.Sleep(0);
}
}
private delegate void CallPositionsThreadingDelegate(int nbr_position);
private void UpdateCarPosition(int nbr_position)
{
if (this.InvokeRequired)
{
// we were called on a worker thread
// marshal the call to the user interface thread
this.Invoke(new CallPositionsThreadingDelegate(UpdateCarPosition), new object[] { nbr_position });
return;
}
Coord.GetJustOnePosition(positions,DriverCoord,nbr_position);
DisplayMapFromOneCoord(positions, drivingmodemap.Height, drivingmodemap.Width,500);
} |
Donc les deux thread sont : ListenerPedestrianThreading et CallPositionsThreading, celui qui fonctionne bizarrement est le 1er. ( le second est ok, du moins les positions sont bien affichées comme voulu!)
La méthode : WaitingForSomeoneAskingMe, fonctionne correctement en principe car comme je l'ai dit précédemment sans multithreading, la variable passait bien à 1.
Peut être que le traitement est long, et que le thread n'a jamais le temps de lire la variable convenablement?
Il ya aussi un autre problème au niveau des Abort();, apparemment ils ne fonctionnent pas comme je le pensais, j'ai écrit le code suivant:
Code:
1 2 3 4 5 6 7
|
private void menuItem1_Click(object sender, EventArgs e)
{
monThread1.Abort();
monThread2.Abort();
Close();
} |
Pourtant, lorsque je clique sur menuItem1 les thread ne s'arrêtent pas !
Pourquoi ?
Je vous remercie pour votre aide :)