2017-01-28 4 views
1

У меня вопрос о добавлении точек в диаграммы.C# Добавление точек в диаграмму в реальном времени

Приложение для Windows Forms использует поток, чтобы получить значение Y с другого сервера. Каждые 500 мс я получаю новое значение (строка), которое должно быть добавлено как точка, но я понятия не имею, как это сделать. Было бы очень приятно, если точки будут отображаться в реальном времени, а не только после завершения процесса. Я думаю, что это не очень сложный вопрос, но я не нашел решения.

Тема:

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

Какая структура пользовательского интерфейса вы используете? (Пожалуйста, отредактируйте свой пост, чтобы он отражал это) –

+0

Это также помогло бы, если вы разместите свой код, чтобы пользователи увидели, где вы застряли :) –

+0

@EyalPerry Я предполагаю, что он использует Winforms и собственный элемент управления элементами управления. .. (в тегах) – 97hilfel

ответ

0

У вас есть классический Producer-Consumer сценарий на руках.

Это означает, что одна нить производит элемент (фоновый поток)
Пока другой потребляет его (поток пользовательского интерфейса).

Один из способов общения между производителем и потребителем является с событием:

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

Тогда в вашей форме вы можете сделать так:

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

Обратите внимание, что WinForms однопоточен , что означает, что нить не может работать непосредственно с элементом пользовательского интерфейса, если только он не является потоком пользовательского интерфейса.
Именно поэтому я назвал метод Invoke - он просто разгружает работу, выполняемую в потоке пользовательского интерфейса.

+0

Большое вам спасибо! Это сработало для меня –

+0

@TimB. Добро пожаловать :) Пожалуйста, отметьте ответ как принятый (нажмите на V). Добрый день! –

Смежные вопросы