0

現在、スレッドを使用して自動入力していzedgraph chartます。問題は、それが非常に遅く、それが生産に良くないということです。

それを知っている:
1。Threadリモートサーバーから新鮮なデータを取得し、ローカルテキストファイルに保存するための実行中のバックグラウンドがあります。
2.別のスレッドがローカルファイルにアクセスしてデータを読み取り、zedgraphチャートを更新します。

個人的には、これによりアプリケーションの実行が非常に遅くなると思います。
Timerコンポーネントは、この種のものを処理するのに適している場合があります。
ZedGraph Live Dataの経験がある人はいますか?
または、アドバイスを歓迎します。


編集:UIを更新
また、ユーザーがグラフを表示するためにフォームを閉じたり開いたりする必要がないように、スレッド内の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 に答える