C#实时向Chart添加点数

时间:2017-01-28 12:33:00

标签: c# winforms charts backgroundworker data-handling

我有一个关于为图表添加点数的问题。

我的Windows窗体应用程序正在使用线程从另一台服务器获取Y值。每500毫秒我得到一个新的值(字符串)应该作为一个点添加,但我不知道如何做到这一点。如果点将实时显示并且不仅在结束过程之后,那将是非常好的。 我认为这不是一个真正困难的问题,但我没有找到解决方案。

主题:

library(rvest)

scrape <- function() {
  for (i in 1:20) {
    child1 <- html_children(listing)
    child2 <- html_children(child1[i+1])
    child3 <- html_children(child2[2])
    #getting to the layer of price
    price <- html_text(child3[3])
    print(price)
  }
}

for (j in 1:5) {  
  url <- paste("https://www.srx.com.sg/search/sale/residential?page=", j, sep = "")
  srx <- read_html(url)
  listing <- html_nodes(srx, ".listing-box")
  scrape()
}

配置和图表

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

感谢您的帮助:)

1 个答案:

答案 0 :(得分: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);
        }
    }
   }

然后,在您的表单中,您可能会这样:

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线程上执行的工作。