0

目前,我正在使用线程来自动填充zedgraph chart. 问题是它非常慢,不利于生产。

知道:
1. 有一个Thread运行后台从远程服务器获取新数据并将它们存储在本地文本文件中。
2. 有另一个线程访问本地文件并读取数据并刷新zedgraph图表。

我个人认为这会使应用程序运行非常缓慢。
Timer组件可能更好地处理这种东西。
有人在 ZedGraph 实时数据方面有经验吗?
或者任何建议都会受到欢迎。


编辑:更新用户界面
另外我想知道如何在线程中更新 UI,这样用户就不必关闭和打开表单来查看图表。
谢谢

4

1 回答 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 回答