我是GUI编程世界的新手,我正在使用IronPython和WinForms编写一个小GUI应用程序。它从外部设备读取值并将其显示在ListView组件(名称,值)中。我想定期以固定的速率执行ListView组件的读取和更新。
我有以下想法来实现这个目标:
由于第一个解决方案将阻止GUI直到读取/更新循环完成,这取决于从设备读取的值的数量,可能需要一些时间,我认为BackgroundWorker可能是更好的解决方案。我可能想稍后添加一些功能来操作ListView项目(添加,删除值等),并且阻止的GUI似乎不是一个好主意。
是否有某种设计模式或更好的方法来完成阅读/更新屏幕数据?
注意 :任何代码示例都可以是IronPython或C#。从C#到IronPython的转换非常简单。谢谢!的
答案 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线程中的控件。