2017-01-28 1 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 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 
    })); 
} 
} 

참고 : 양식에 당신과 같이 할 수

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

다음 : 생산자와 소비자 사이에 통신 할 수

한 가지 방법은 이벤트와이다 UI 스레드가 아닌 한 UI 요소에서 직접 스레드를 사용할 수 없음을 의미합니다.
이것이 내가 Invoke 메서드를 호출 한 이유입니다. UI 스레드에서 수행 할 작업을 간단히 오프로드합니다.

+0

정말 고마워요! 이것은 나를 위해 일했다 –

+0

@ TimB. 환영합니다 :) 답변을 수락 한 것으로 표시하십시오 (V를 클릭하십시오). 좋은 하루 친구! –