目前,我正在使用线程来自动填充zedgraph chart
. 问题是它非常慢,不利于生产。
知道:
1. 有一个Thread
运行后台从远程服务器获取新数据并将它们存储在本地文本文件中。
2. 有另一个线程访问本地文件并读取数据并刷新zedgraph图表。
我个人认为这会使应用程序运行非常缓慢。
Timer
组件可能更好地处理这种东西。
有人在 ZedGraph 实时数据方面有经验吗?
或者任何建议都会受到欢迎。
编辑:更新用户界面
另外我想知道如何在线程中更新 UI,这样用户就不必关闭和打开表单来查看图表。
谢谢
问问题
1267 次
1 回答
1
我将采取的方法如下:
您创建一个保存数据的类(这也可以是您已经拥有的同一个类),我将称之为示例InformationHolder
。
class InformationHolder {
private static InformationHolder singleton = null;
public List<float> graphData; //Can be any kind of variable (List<GraphInfo>, GraphInfo[]), whatever you like best.
public static InformationHolder Instance() {
if (singleton == null) {
singleton = new InformationHolder();
}
return singleton;
}
}
现在您需要一个类,它将在后台获取您的信息,对其进行解析并将其插入到上述类中。
示例Thread.Sleep()
:
class InformationGartherer {
private Thread garthererThread;
public InformationGartherer() {
garthererThread = new Thread(new ThreadStart(GartherData));
}
private void GartherData() {
while (true) {
List<float> gartheredInfo = new List<float>();
//Do your garthering and parsing here (and put it in the gartheredInfo variable)
InformationHolder.Instance().graphData = gartheredInfo;
graphForm.Invoke(new MethodInvoker( //you need to have a reference to the form
delegate {
graphForm.Invalidate(); //or another method that redraws the graph
}));
Thread.Sleep(100); //Time in ms
}
}
}
示例Timer
:
class InformationGartherer {
private Thread garthererThread;
private Timer gartherTimer;
public InformationGartherer() {
//calling the GartherData method manually to get the first info asap.
garthererThread = new Thread(new ThreadStart(GartherData));
gartherTimer = new Timer(100); // time in ms
gartherTimer.Elapsed += new ElapsedEventHandler(TimerCallback);
gartherTimer.Start();
}
private void TimerCallback(object source, ElapsedEventArgs e) {
gartherThread = new Thread(new ThreadStart(GartherData));
}
private void GartherData() {
List<float> gartheredInfo = new List<float>();
//Do your garthering and parsing here (and put it in the gartheredInfo variable)
InformationHolder.Instance().graphData = gartheredInfo;
graphForm.Invoke(new MethodInvoker( //you need to have a reference to the form
delegate {
graphForm.Invalidate(); //or another method that redraws the graph
}));
}
}
要获得对表单的引用,您可以使用与 InformationHolder 相同的技巧:使用单例。当您想使用信息时,只需从以下位置获取信息InformationHolder
:
InformationHolder.Instance().graphData;
正如我所说,这就是我个人将如何解决这个问题。可能有更好的解决方案我不知道。如果您有任何问题,可以在下面发布。
于 2013-01-10T12:41:25.253 回答