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 :
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!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
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:
Pourtant, lorsque je clique sur menuItem1 les thread ne s'arrêtent pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 private void menuItem1_Click(object sender, EventArgs e) { monThread1.Abort(); monThread2.Abort(); Close(); }
Pourquoi ?
Je vous remercie pour votre aide
Partager