Bonjour
Je calcule le contenu de courbes à afficher sur les série d'un MS chart sur une winform avec ceci
Cela fonctionne à merveille
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 try { foreach (TreeNode ssNode in ssNodesChecked) { String NomSerie = ssNode.FullPath; chart1.Series.Add(NomSerie); // Création de la série de donnée chart1.Series[NomSerie].ChartType = SeriesChartType.Range; // série de type range pour afficher le min et le max sur la plage de temps du pixel chart1.Series[NomSerie].IsXValueIndexed = false; // pour avoir les absices dans l'ordre et sans trous chart1.Series[NomSerie].XValueType = ChartValueType.DateTime; // axe X de type DateTime Disu.Temporel MaTemporel = new Temporel(NbPixels, Properties.Settings.Default.CheminTravail + "\\" + ssNode.FullPath, DateMin, DateMax); //création d'un objet parallelTasks.Add(MaTemporel.CalculAsync(progressIndicator, ctsTemporel.Token).ContinueWith(tsk => { // Remplissage de la série ctsTemporel.Token.ThrowIfCancellationRequested(); // Annulation si demandée par ailleurs for (int i = 0; i < MaTemporel.NbpixelsFinal ; i++) { chart1.Series[NomSerie].Points.AddXY(MaTemporel.ResArray[i, 0], MaTemporel.ResArray[i, 1], MaTemporel.ResArray[i, 2]); } }, ctsTemporel.Token)); } await Task.WhenAll(parallelTasks.ToArray()); } catch (OperationCanceledException) { toolStripStatusLabel1.Text = "Génération des courbes annulée !"; chart1.Series.Clear(); chart1.Invalidate(); //force le redessin du chart return; } catch (Exception ex) { toolStripStatusLabel1.Text = "Erreur pendant la génération des courbes ! : " + ex.ToString(); chart1.Series.Clear(); chart1.Invalidate(); //force le redessin du chart return; }
Maintenant, si j'ajoute des modification des séries ainsi
ca plante à la ligne indiquée avec une exception "System.InvalidOperationException" "Opération inter-threads non valide*: le contrôle 'chart1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."
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 try { foreach (TreeNode ssNode in ssNodesChecked) { String NomSerie = ssNode.FullPath; chart1.Series.Add(NomSerie); // Création de la série de donnée chart1.Series[NomSerie].ChartType = SeriesChartType.Range; // série de type range pour afficher le min et le max sur la plage de temps du pixel chart1.Series[NomSerie].IsXValueIndexed = false; // pour avoir les absices dans l'ordre et sans trous chart1.Series[NomSerie].XValueType = ChartValueType.DateTime; // axe X de type DateTime Disu.Temporel MaTemporel = new Temporel(NbPixels, Properties.Settings.Default.CheminTravail + "\\" + ssNode.FullPath, DateMin, DateMax); //création d'un objet parallelTasks.Add(MaTemporel.CalculAsync(progressIndicator, ctsTemporel.Token).ContinueWith(tsk => { // Remplissage de la série ctsTemporel.Token.ThrowIfCancellationRequested(); // Annulation si demandée par ailleurs for (int i = 0; i < MaTemporel.NbpixelsFinal ; i++) { chart1.Series[NomSerie].Points.AddXY(MaTemporel.ResArray[i, 0], MaTemporel.ResArray[i, 1], MaTemporel.ResArray[i, 2]); } // Modif des markers suivant nombre de points affichés if (MaTemporel.NbpixelsFinal < NbPixels / 4) { MessageBox.Show(chart1.Series[NomSerie].Points.Count.ToString()); chart1.Series[NomSerie].MarkerStyle = MarkerStyle.Square; chart1.Series[NomSerie].MarkerColor = Color.Black; chart1.Series[NomSerie].ToolTip = "#VALY - #VALX{G}"; } else { chart1.Series[NomSerie].ToolTip = ""; chart1.Series[NomSerie].MarkerStyle = MarkerStyle.None; //## ca plante ici } }, ctsTemporel.Token)); } await Task.WhenAll(parallelTasks.ToArray()); } catch (OperationCanceledException) { toolStripStatusLabel1.Text = "Génération des courbes annulée !"; chart1.Series.Clear(); chart1.Invalidate(); //force le redessin du chart return; } catch (Exception ex) { toolStripStatusLabel1.Text = "Erreur pendant la génération des courbes ! : " + ex.ToString(); chart1.Series.Clear(); chart1.Invalidate(); //force le redessin du chart return; }
Là où je ne comprends plus rien c'est que ce code qui plante est juste aprés, dans la même portée quequi fonctionne pourtant très bien sans exception...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for (int i = 0; i < MaTemporel.NbpixelsFinal ; i++) { chart1.Series[NomSerie].Points.AddXY(MaTemporel.ResArray[i, 0], MaTemporel.ResArray[i, 1], MaTemporel.ResArray[i, 2]); }
Comment une ligne peut elle être sur le bon thread et la suivante, dans la même portée, non ?
Le truc c'est que je ne vois pas où placer mon code autre-part...
Merci par avance
Partager