2017-01-28 6 views
1

Ich habe eine Frage zum Hinzufügen von Punkten zu Diagrammen.C# Hinzufügen von Punkten zu Chart in Echtzeit

Meine Windows Forms-Anwendung verwendet einen Thread, um den Y-Wert von einem anderen Server zu erhalten. Alle 500ms bekomme ich einen neuen Wert (string), der als Punkt hinzugefügt werden sollte, aber ich habe keine Ahnung, wie das geht. Es wäre wirklich schön, wenn die Punkte in Echtzeit angezeigt werden und nicht erst nach dem Beenden des Prozesses. Ich denke, es ist keine wirklich schwierige Frage, aber ich habe keine Lösung gefunden.

Thema:

private void Work() 
    { 
     int counter = 0; 

     while (true) 
     { 
      counter++; 
      WebClient code = new WebClient(); 
      speed_str = code.DownloadString("http://192.168.19.41/speedfile.html"); 
      speedval = Convert.ToDouble(speed_str); 
      Console.WriteLine(speedval.ToString() + "\n Times executed: " + counter); 
      Thread.Sleep(1000); 
     } 
    } 

Konfiguration und Chart

Thread thread = new Thread(new ThreadStart(this.Work)); 
     thread.IsBackground = true; 
     thread.Name = "My Worker."; 
     thread.Start(); 

     //Speed 
     Series speed = new Series("Speed[m/s]"); 

     speed.ChartType = SeriesChartType.Spline; 


     //Engines Left 
     engleft = new Series("Engines Left"); 

     engleft.ChartType = SeriesChartType.Spline; 

     Engines.Series.Add(engleft); 

     engleft.Points.Clear(); 

     string speed_read = Console.ReadLine(); 

Vielen Dank für Hilfe :)

+0

Welches UI-Framework verwenden Sie? (Bitte bearbeiten Sie Ihren Beitrag, damit er das widerspiegelt) –

+0

Es würde auch helfen, wenn Sie Ihren Code posten, damit Benutzer sehen würden, wo Sie steckenbleiben :) –

+0

@EyalPerry Ich nehme an, dass er Winforms und das native Steuerelement chartview verwendet. .. (in den Tags) – 97hilfel

Antwort

0

Sie haben ein klassisches Producer-Consumer Szenario an den Händen.

Das bedeutet, dass ein Thread produziert ein Element (der Hintergrund-Thread)
Während ein anderer es verbraucht (der UI-Thread).

Eine Möglichkeit, zwischen einem Hersteller und einem Verbraucher zu kommunizieren, ist mit einem Ereignis:

class Producer 
    { 

    public event EventHandler<double> YSeriesEvent; 
    private Thread thread; 

    public Producer() 
    { 
     thread = new Thread(new ThreadStart(this.Work)); 
     thread.IsBackground = true; 
     thread.Name = "My Worker.";  
    } 

    public void Start() 
    { 
     thread.Start(); 
    } 

    private void Work() 
    { 
     int counter = 0; 

     while (true) 
     { 
      counter++; 
      WebClient code = new WebClient(); 
      speed_str = code.DownloadString("http://192.168.19.41/speedfile.html"); 
      speedval = Convert.ToDouble(speed_str); 
      YSeriesEvent?.Invoke(this, speedval); 
     } 
    } 
    } 

in Ihrem Formular Dann können Sie wie so tun:

class MyForm : Form 
{ 

private Producer producer; 

public MyForm() 
{ 
    producer = new Producer(); 
    producer.YSeriesEvent += MyHandler ; 
    Load+= (sender, args) => producer.Start(); 
} 

private void MyHandler(object o, double val) 
{ 
    Invoke(new Action(() => 
    { 
      //add value to chart here 
    })); 
} 
} 

Beachten Sie, dass WinForms Gewinde ist Single Dies bedeutet, dass kein Thread direkt auf einem UI-Element funktionieren kann, es sei denn, es handelt sich um den UI-Thread.
Deshalb habe ich die Invoke Methode aufgerufen - es lädt einfach die Arbeit aus, die auf dem UI-Thread ausgeführt werden soll.

+0

Vielen Dank! Das hat bei mir funktioniert –

+0

@TimB. Sie sind herzlich willkommen :) Bitte markieren Sie die Antwort als akzeptiert (klicken Sie auf das V). Guten Tag, Kumpel! –

Verwandte Themen