0

我有一个 Tkinter/ttk 应用程序,它分析每 10-25 毫秒到达的数据包。我目前的实现使用一个线程,在每次读取套接字后更新 30 个 StringVar,然后调用 update_idletasks() 来更新相应的 Entry 小部件。我的应用程序在启动后不超过 30 分钟崩溃。

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

  1. 使用线程+队列。

  2. 使用函数 + .after(1, function)。

UI 只是启动/停止更新,并提供 Entry 小部件以供显示。

系统中的主要等待是套接字读取,它的超时是预期数据包速率的 2 倍(因此它不能永远阻塞)。

在这种情况下,您更喜欢方法#1 还是#2?

我倾向于 #2 的简单性,但我不确定是否有任何 Tk 陷阱在这条路上等待。在等待社区智慧的同时,我可能会同时尝试两者。

4

2 回答 2

0

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

话虽如此,在这种特殊情况下,我想我会选择线程+队列。既然您知道显示应该多久更新一次,我会每 10 毫秒左右设置一次队列轮询以更新小部件。

于 2013-04-29T15:47:55.023 回答
0

我刚刚通过更改原始实现中的 8 行代码来实现 #2 (function + .after(1, function)),它运行良好。因此,#2 基于简单性和有效性获胜。它使用 3-4% 的 1 个核心 (i5-2500, 3.3 GHz) 运行

但如果我的 UI 变得更复杂,例如通过 matplotlib 动画添加条形图记录,则可能需要队列和单独的采集线程。但不是今天!

编辑:但不要使用 .after(0, ...): 我的 UI 在我尝试时被锁定。

于 2013-04-29T16:13:14.807 回答