2009-09-15 26 views
0

我的程序由一个大型图形UI控件组成,我需要花费大约15秒的时间每隔一段时间加载一次。因为更新代码主要与UI控件一起工作(可能有90%实际上是在控件上设置属性),所以让我真正让UI线程处理它是有意义的。我真的不希望控件在从UI单独加载的同时加载可视化对象。使用WPF应用程序的UI线程在UI元素上执行长处理任务,但也在同一窗口上更新进度条

我也想要一个进度条来更新以及生活在同一个应用程序窗口的状态栏中。在这种情况下是否有办法打破规则并重新绘制进度条,或者是否应该为进度条打开一个新的应用程序窗口?

你会在这种特殊情况下做什么?

回答

2

如果您可以在很多步骤中打破主要任务(即更新图形),则可以将每个步骤作为单独的调度程序消息执行。这将允许处理其他消息,包括让您能够更新进度信息。

的基本模式是:

  1. 调用你的首要任务,以零为合格的一步。
  2. 执行此步骤。
  3. 如果有更多的步骤,队列中的另一个消息,传递步骤+ 1。

您可以在进度更新在你的代码中的适当位置,然后添加。

PS。不要说这是你最好的选择 - 很难说不知道所有的细节。但是这是一个选择。

0

查找效率更高的图形UI控件。除非UI线程产生消息循环,否则任何其他更新都不会发生(并且会减慢图形控件的更新)。

+0

大部分时间更新只有2到5秒,但可能会达到极端20秒。你只是住在一起,忘记进度条?不幸的是,现在不可能找到更好的图形控制。 – 2009-09-15 09:02:07

0

我会建议在新窗口中使用进度条(不带表格标题)。通过读取图形控件的共享属性来绘制进度条。这种方式可以避免线程阻塞(加载缓慢)。并且它可以为您提供良好的视觉体验(两个控件上的渐进式绘画)。

1

It is not really true that there is only one UI thread in an application,只是大多数Windows应用程序只在一个线程中创建UI对象,所以这个线程变成应用程序中的“UI”线程。很容易理解为什么 - 这使得代码更易于理解,并保护我们免受控件之间的隐式线程绑定问题的困扰。

这表明一个可能的想法,如果证明不可能提高更新控制的速度(这是我建议先做的)。在单独的线程上创建UI控件。您需要确保该线程适用于UI,that is to say the threading model is STA,并且它会在控制销毁之前泵送消息并且不会死亡。我不知道是否需要在UI线程中创建父窗口,或者只是在控件中创建父窗口,但在这里可能值得尝试。

+0

您无法在线程A上创建控件,然后将其添加到您在线程B上创建的控件。如果你尝试,你会得到一个InvalidOperationException:“调用线程不能访问这个对象,因为不同的线程拥有它。”窗口内的所有内容必须位于同一个线程中。也就是说,如果进度条线程有自己的窗口,可以使其工作。 – 2009-09-15 13:17:21

相关问题