0

次の問題を回避する方法について問題があります。

フォーム上のグラフを動的に更新および表示できるクラスがあります。グラフの値を更新するために、フォームのクラス内にメソッドがあります。グラフを更新する値をこのメソッドに渡します。これが私がやろうとしていることの高レベルの例です:

クラス GUICLass : フォーム {

//チャートなどを描画するコードはすべてここにあります

public updategraphWithNewValue(double value){

 // Code to update the graph

}

}

私の他のクラスは次のとおりです。

クラスValueProviderForGraph{

GUIClass graphForm = new GUIClass();

public calculateValuesAndPlot(){

for(int i = 0; i < 4000; i++){

  graphForm.updategraphWithNewValue(i);

  graphForm.update();

}

}

}

上記から得られる問題は、この操作の実行中にフォームがフリーズすることです。どうすればこれを回避できますか、助けやアドバイスをいただければ幸いです。この高レベルの例で十分な情報が得られることを願っています。そうでない場合はお知らせください。ありがとう。

4

3 に答える 3

5

BackgroundWorkerの使用を検討してください。そのイベント指向のインターフェイスにより、すぐに起動して実行できるはずです。

于 2013-01-28T22:08:07.783 に答える
2

コントロールが最初に作成されたスレッドからのみ、フォームのコントロールを更新できます。

別のスレッドから更新しようとしている場合は、その呼び出しをマーシャリングする必要があります。ウェブ上には数多くのアプローチがあります。私の個人的なお気に入り (WinForms 用) は次のとおりです。

https://stackoverflow.com/a/709846/141172

アップデート

@StenPetrov の促しで質問を読み直した後、結局、クロススレッドの問題は発生していないと思いますが、UI スレッドはグラフの更新中にメッセージを処理していないだけです (これにより、グラフの更新中にフリーズが発生します)。操作)。

UI スレッドがグラフの更新でビジー状態の場合、その動作が発生します。ただし、グラフに不要な更新を 3999 回実行させているようです。線を移動してみる

graphForm.update();

forループの外側。

グラフ コントロールがどのように機能するかは正確にはわかりませんが、 への呼び出しupdate()によってグラフ全体が再レンダリングされるのではないかと思われます。これは、すべての新しいデータ ポイントが追加された後にのみ行う必要があります。

于 2013-01-28T22:09:03.900 に答える
0

UI を頻繁に更新する必要がありますか?

表示用に大きなグラフをロードするなど、UI を頻繁に更新する必要がない場合は、BackgroundWorker で十分です。

UI を頻繁に更新する必要がある場合は、(a) グラフの計算を UI から独立させ、(b) 別のスレッドでグラフの計算を実行し、(c) 更新の計算後に Form.Invoke(...) を使用する必要があります。 UIを更新する

于 2013-01-28T22:12:49.057 に答える