2013-04-29 62 views
0

我有一个Tkinter/ttk应用程序,可以分析每10-25毫秒到达的数据包。我现在的实现使用一个线程,每读取一次套接字后更新30个StringVars,然后调用update_idletasks()更新相应的Entry小部件。我的应用程序在启动后不超过30分钟内崩溃。实时Tkinter/ttk条目小部件更新:线程+队列或.after(1)?

搜索,发现Tk是不是真正线程安全的,并且我有两个主要的选择:

  1. 使用一个线程+队列。

  2. 使用功能+。经过(1,函数)。

的UI做多一点开始/停止更新,并提供用于显示的条目小部件。

在该系统中的主要的等待是套接字读,它具有2×的超时的期望的分组速率(因此它不能永远块)。

在这种情况下,你会喜欢的方式#1或#2?

我倾向于#2它的简单,但我不知道是否有任何Tk的陷阱沿该路径等。当我等待社区智慧时,我可能会尝试两种方式。

回答

0

我个人的经验法则是避免线程,除非他们是严格要求的。线程增加了复杂性。另外,有很大一部分程序员不是特别精通线程的,所以如果这个程序将被其他人使用或维护,那么线程会添加一个风险元素。

话虽这么说,在这种特殊情况下,我想我会用线+排队去。既然你知道显示器应该更新的频率,我会每隔10ms设置一次轮询队列以更新小部件。

+0

如果我有更复杂的用户界面,我会同意! – BobC 2013-04-29 16:03:30

0

我刚刚实现#2(函数+ .after(1,函数)),通过改变我的原始实现中的8行代码,它完美运行。所以#2赢得了简单和有效的基础。它运行使用1芯(i5-2500,3.3千兆赫)

但是3-4%,如果我的UI变得更加复杂,例如,通过经由matplotlib动画添加带状图记录,则队列和一个单独的采集线程可能需要。但不是今天!

编辑:但不要使用。经过(0,...):我的UI关起来时,我试了一下。