用于定期更新屏幕数据的模式

时间:2010-08-29 15:03:24

标签: c# winforms ironpython

我是GUI编程世界的新手,我正在使用IronPython和WinForms编写一个小GUI应用程序。它从外部设备读取值并将其显示在ListView组件(名称,值)中。我想定期以固定的速率执行ListView组件的读取和更新。

我有以下想法来实现这个目标:

  • 计时器,它会定期在OnTick处理程序中触发读取/屏幕更新
  • 一个计时器,其OnTick处理程序触发BackgroundWorker执行读取/更新

由于第一个解决方案将阻止GUI直到读取/更新循环完成,这取决于从设备读取的值的数量,可能需要一些时间,我认为BackgroundWorker可能是更好的解决方案。我可能想稍后添加一些功能来操作ListView项目(添加,删除值等),并且阻止的GUI似乎不是一个好主意。

是否有某种设计模式或更好的方法来完成阅读/更新屏幕数据?

注意 :任何代码示例都可以是IronPython或C#。从C#到IronPython的转换非常简单。谢谢!

3 个答案:

答案 0 :(得分:3)

就个人而言,我有一个线程负责从设备读取值并将数据存储在数据结构中,然后是System.Windows.Forms.Timer(.NET中有3 Timer个,这是唯一一个在线程中可以安全地更新控件的程序,以读取该数据结构中的值并更新UI。您可能需要同步该数据结构。

这样设备可以随意返回数据,或者它可以每秒推送数百万行,UI线程仍然会以您预定的滴答速率(可能每100毫秒? )。由于您的计时器滴答只是读取内存中的数据,因此UI不会阻止IO。

答案 1 :(得分:2)

当你在后台做很多工作时,BackgroundWorker是首选。

使用Timer触发将在第二个线程中执行必要工作的函数。

它不会阻止UI。 (不要忘记更新UI线程上的控件)

System.Threading.Thread newThread;
newThread = new System.Threading.Thread(anObject.AMethod);

http://msdn.microsoft.com/fr-fr/library/ms173178(VS.80).aspx

答案 2 :(得分:1)

另一个选项而不是让Timer和Background工作线程工作将是使用System.Threading.Timer,这将定期在一个线程上执行你的方法,一旦你有了数据,你就可以使用{{ 3}}或Control.BeginInvoke更新UI线程中的控件。