目前,我正在使用线程自动填充zedgraph chart
。问题是它非常慢,对生产来说不好。
知道:
1.有Thread
运行后台从远程服务器获取新数据并将其存储在本地文本文件中
2.还有另一个线程访问并从本地文件中读取数据并刷新zedgraph图表。
Personnaly我认为这会使应用程序运行得非常慢。
Timer
组件可能更适合处理这类内容
有没有人有ZedGraph实时数据的经验?
或者欢迎任何建议。
编辑:更新用户界面
此外,我想知道如何更新线程中的UI,以便用户不必关闭并打开表单来查看图表。
感谢
答案 0 :(得分: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;
正如我所说的,我个人会如何解决这个问题。可能有一个我不知道的更好的解决方案。如果您有任何问题,可以在下面发布。