Bonjour,
J'ai codé ce programme qui marche bien, on a deux threads (Form et Task1). Task1 crée une valeur aléatoire toute les 100 millisecondes.
A la modification de valeur on additionne cette dernière dans un graphique avec la méthode invoke puisque l'on est pas dans le même thread.
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
 
Form1.cs
    public partial class Form1 : Form
    {
        private Test_Onchange DataSource;
        Thread Task1;
        private bool Flag_Stop_Task1;
        public Form1()
        {
            InitializeComponent();
            graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
            graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true;
            graph1.ChartAreas[0].AxisX.ScaleView.Size = 100;
 
            DataSource = new Test_Onchange();
            DataSource.ValueChanged += new EventHandler(EventValueChange);//Value input info
 
            Task1 = new Thread(new ThreadStart(Task_1));//create the thread
            Task1.Start();//start the thread
        }   
        protected virtual void EventValueChange(object sender, EventArgs e)
        {
            double valueMAX=0,size=0;
 
            if (graph1.InvokeRequired)
            {
                graph1.Invoke(new MethodInvoker(delegate { graph1.Series["ValueOnGraph"].Points.AddY(DataSource.Value); }));
                graph1.Invoke(new MethodInvoker(delegate { valueMAX = graph1.ChartAreas[0].AxisX.Maximum; }));
                graph1.Invoke(new MethodInvoker(delegate { size = graph1.ChartAreas[0].AxisX.ScaleView.Size; }));
                if (valueMAX - 10 > size)
                {
                    graph1.Invoke(new MethodInvoker(delegate { graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum); }));
                    graph1.Invoke(new MethodInvoker(delegate { graph1.Series["ValueOnGraph"].Points.RemoveAt(0); }));
                }
            }
        }
        private void Task_1()
        {
            while (!Flag_Stop_Task1)
            {
                Random RandVal = new Random();
                int Value = RandVal.Next(0, 100);
                DataSource.Value = Value;
                Thread.Sleep(100);
            }
            Flag_Stop_Task1 = false;
        }
 
        private void btn_StopTask_1_Click(object sender, EventArgs e)
        {
            Flag_Stop_Task1 = true;
        }  
}
Et la classe Onchange
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
 
    class Test_Onchange
    {
        private int value;
        protected object _lock = new object();
 
        public event System.EventHandler ValueChanged;
 
        protected virtual void OnValueChange()
        {  
            lock (this._lock)
            {
            EventHandler eventvaluechange = ValueChanged;
                if (eventvaluechange != null)
                    eventvaluechange(this, EventArgs.Empty);
            }
        }
 
        public int Value
        {
            get { return this.value; }
            set
            {
                if (value != this.value)
                {//if value changed enter
                    this.value = value;
                    OnValueChange();
                }
            }
        }
}
La question c'est est-ce que le codage semble propre ou vous feriez un peu autrement?
Ce code n'est qu'un test pour avoir une bonne gestion des threads et des events.

Merci par avance!