2017-01-28 6 views
1

チャートにポイントを追加する方法について質問があります。C#リアルタイムでチャートにポイントを追加する

私のWindowsフォームアプリケーションはスレッドを使用して別のサーバーからY値を取得しています。 500msごとにポイントとして追加するべき新しい値(文字列)が得られますが、それをどうするかわかりません。ポイントがリアルタイムで表示され、プロセスを終了した後だけでなく、本当にいいですね。 本当に難しい質問ではないと思いますが、解決策を見つけることができませんでした。

スレッド:助けを

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); 
     } 
    } 

設定とチャート

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(); 

おかげで:)

+0

どのUIフレームワークを使用していますか? (それを反映するようにあなたのポストを編集してください) –

+0

それは、ユーザーがあなたが立ち往生している場所を見ることができるようにコードを投稿する場合にも役立ちます:) –

+0

@EyalPerry彼はWinformsとネイティブコントロール要素chartviewを使用していると仮定します。 ..(タグ内) – 97hilfel

答えて

0

あなたはあなたの手の古典Producer-Consumerシナリオを持っています。

これは、あるスレッドがアイテム(バックグラウンドスレッド)を生成していることを意味します。
別のスレッド(UIスレッド)が消費します。生産者と消費者の間で通信するため

一つの方法は、イベントに次のとおりです。次に

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); 
     } 
    } 
    } 

、フォームにあなたがそうのように行うことができます:WinFormsのはシングルスレッドであることを

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 
    })); 
} 
} 

注意つまり、UIスレッドでない限り、UI要素で直接スレッドを処理することはできません。
これは私がInvokeメソッドを呼び出した理由です。UIスレッドで処理する作業を単純にオフロードします。

+0

ありがとうございました!これは私のために働いた –

+0

@ TimB。あなたは歓迎されています:)(Vをクリックして)受け入れられたと答えてください。良い一日の仲間! –

関連する問題