0

我在如何解决以下问题时遇到问题。

我有一个类,它允许我在表单上动态更新和显示图表。为了更新图表的值,我在表单的类中有一个方法。我传入值以使用此方法更新图形。这是我正在尝试做的一个高级示例:

类 GUICLass : 表格 {

//绘制图表等的代码都在这里

公共 updategraphWithNewValue(双值){

 // Code to update the graph

}

}

我的另一堂课如下:

类 ValueProviderForGraph{

GUIClass graphForm = new GUIClass();

公共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(...)更新用户界面

于 2013-01-28T22:12:49.057 回答