我有一个关于为图表添加点数的问题。
我的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);
}
}
感谢您的帮助:)
答案 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线程上执行的工作。