我正在使用.NET的Microsoft图表库。我试图绘制从硬件每10ms生成的数据。这通常很好,除非我移动主窗体。然后更新图表会阻止工作线程。请参阅附加代码作为模拟数据的示例。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace ChartTest
{
public partial class Form1 : Form
{
private Worker _worker;
double oldData;
public Form1()
{
InitializeComponent();
oldData = 0.0;
_worker = new Worker();
_worker.NewDataEvent += new EventHandler(_worker_NewDataEvent);
}
void _worker_NewDataEvent(object sender, EventArgs e)
{
double data = _worker.GetData();
Add(data - oldData);
oldData = data;
}
private delegate void AddDelegate(double data);
public void Add(double data)
{
if (chart1.InvokeRequired)
{
chart1.Invoke(new AddDelegate(Add), data);
}
else
{
chart1.Series[0].Points.AddY(data);
}
}
private void btnGo_Click(object sender, EventArgs e)
{
_worker.Start();
}
}
public class Worker
{
private double data;
Stopwatch st;
bool running;
public Worker()
{
data = 0.0;
st = new Stopwatch();
running = false;
}
public event EventHandler NewDataEvent;
public void Start()
{
running = true;
Thread t = new Thread(Run);
t.Start();
}
private void Run()
{
st.Start();
while (running)
{
Thread.Sleep(10);
data = (double)st.ElapsedTicks / (double)Stopwatch.Frequency;
NewDataEvent(this, null);
}
}
public double GetData()
{
return data;
}
}
}
注意:如有必要,我可以提供设计师代码。
Worker类运行一个每10毫秒生成一些数据的线程。它引发了一个事件,Form1用它来调用图表中的更新。这通常很好,除非延迟UI渲染,例如拖动表单。如果worker的Run()函数对时间要求严格,则会出现问题。有没有办法在不阻塞线程的情况下尽快更新图表?
如果这意味着有时需要图表20毫秒来更新,那很好。我希望它能尽快更新。感谢。
答案 0 :(得分:0)
(我假设它是WPF,你的图表只是添加点,而不是像填充区域更多花哨部分的图表):
每10毫秒意味着您每秒添加100个图形对象,如果您的应用程序保持打开1分钟,您的图表至少有6000个图形对象,当您移动主窗口时,UI需要重绘至少6000个图形对象!我认为这是预料之中的!现在也添加区域,颜色和厚度以及其他东西...... UI线程实际上已用尽。
我认为你最好先采用某种数学过程(像插值这样的分析或统计过程)来产生有意义的抽样,然后画出它们。
我不太了解Win Forms,但我认为这对他们来说也是正确的。