我有一个关于在图表上添加点的问题。
我的Windows窗体应用程序正在使用线程从另一台服务器获取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();
感谢帮助 :)
您手上有一个经典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);
}
}
}
然后,以您的形式,您可能会这样:
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是单线程的,这意味着没有线程可以直接在UI元素上工作,除非它是UI线程。
这就是为什么我调用该Invoke
方法的原因-它只是减轻了要在UI线程上执行的工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句