Bonjour tout le monde!
Alors voilà, j'ai un petit problème avec les array list et mes threads.
L'idée c'est que dans mon programme, j'affiche des graphes contenant des données extraites après traitement d'images.
Donc mon prog capture les images à rythme constant et quand une image est traitée on déclenche un event qui envoie aux graphes les points à tracer en temps réel pour actualiser les graphes.
Le programme est fait de façon que les points du graphes sont stockées dans un array list, que je parcours avec un for each pour tracer mon graphe.
Le problème c'est que je me prends de temps en temps et de manière aléatoire une erreur: "Collection was modified; enumeration operation may not execute".
Ce qui me parait assez logique puisque pendant qu'il lit mon array list, il y a de grandes chances que des données arrives et soient placées dedans.
Après avoir chercher sur le net, j'ai vu qu'il y avait des méthodes de synchronisation, mais ça ne donne rien, quelqu'un aurait une idée?
Voilà le code:
J'ai aussi une fonction setValue pour mettre une valeur dans le arraylist depuis l'extérieur.
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 public void Draw(Graphics generalGraphs, Point ptOffset) { float x, y, x0, y0; Pen BluePen = new Pen(Color.Blue, 2); //... //draw chart data datapoint prevPoint = new datapoint(); foreach (datapoint myPoint in chartValuesSync) { x0 = ChartWidth * (prevPoint.x - graphOriginX) / graphScaleX + ChartInset; y0 = graphHeight - (ChartHeight * (prevPoint.y - graphOriginY) / graphScaleY + ChartInset); x = ChartWidth * (myPoint.x - graphOriginX) / graphScaleX + ChartInset; y = graphHeight - (ChartHeight * (myPoint.y - graphOriginY) / graphScaleY + ChartInset); if (y0 != (graphHeight - (ChartHeight * (0 - graphOriginY) / graphScaleY + ChartInset))) { g.DrawLine(BluePen, x0, y0, x, y); } prevPoint = myPoint; } } generalGraphs.DrawImage(b, ptOffset.X, ptOffset.Y); }
J'ai essayé d'ajouter un:
ArrayList chartValuesSync = ArrayList.Synchronized(chartValues);
Puis de prendre les valeurs là-dedans mais ça donne toujours l'erreur.
De même avec un :
lock (chartValuesSync.SyncRoot)
avant de rentrer dans le if.
Voilà, en espérant avoir été clair et que quelqu'un pourra m'aider,
bye
Partager