2013-04-29 65 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關起來時,我試了一下。