C#实时向图表添加点

B队

我有一个关于在图表上添加点的问题。

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

感谢帮助 :)

艾尔·佩里(Eyal Perry)

您手上有一个经典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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在图表的左侧添加点

来自分类Dev

在图表左侧添加点

来自分类Dev

在C#中向图表添加水平线

来自分类Dev

如何在C#中使用委托向图表添加值

来自分类Dev

随着数据处理并将其添加到图表中,“实时图表”图的刷新速度变慢WPF c#

来自分类Dev

C#中带有串口数据的实时图表

来自分类Dev

如何在系列图表Highcharts的开头添加点

来自分类Dev

Google图表向图表添加选项

来自分类Dev

向图表系列添加文本

来自分类Dev

动态向图表添加序列

来自分类Dev

向Google图表添加图例

来自分类Dev

向图表添加颜色条

来自分类Dev

在Three.js中向顶点添加点

来自分类Dev

如何使用plotly express向折线图添加点?

来自分类Dev

使用QDateTimeAxis x轴时如何向QChart添加点

来自分类Dev

如何在书本目录中向LabelView添加点(椭圆)

来自分类Dev

通过JS向元素添加点击量

来自分类Dev

多线程-在VB中向系列添加点

来自分类Dev

HTML 和 JavaScript - 如何向 div 添加点击事件

来自分类Dev

向文字C#添加滚动

来自分类Dev

将轴名称添加到图表C#

来自分类Dev

将轴名称添加到图表C#

来自分类Dev

C#在图表上添加到Y值

来自分类Dev

C# 如何向动态添加的 MSChart 添加数据?

来自分类Dev

通过“实时感觉”向JTable添加行

来自分类Dev

通过“实时感觉”向JTable添加行

来自分类Dev

实时从Sqlite向recyclerView添加数据?

来自分类Dev

向Excel图表异常添加序列

来自分类Dev

向图表添加其他数据点