簡體   English   中英

實時Tkinter / ttk條目小部件更新:線程+隊列還是.after(1)?

[英]Real-time Tkinter/ttk Entry widget update: thread+queue or .after(1)?

我有一個Tkinter / ttk應用程序,可以分析每10-25毫秒到達的數據包。 我當前的實現使用一個線程,該線程在每次讀取套接字后都會更新30個StringVars,然后調用update_idletasks()來更新相應的Entry窗口小部件。 啟動后,我的應用程序崩潰不超過30分鍾。

搜索發現Tk並不是真正的線程安全的,我有兩個主要選擇:

  1. 使用線程+隊列。

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

用戶界面除了啟動/停止更新外,並提供用於顯示的Entry小部件。

系統中的主要等待是套接字讀取,其超時時間是預期數據包速率的2倍(因此無法永遠阻塞)。

在這種情況下,您希望使用方法1還是方法2?

為了簡單起見,我傾向於#2,但是我不確定在這條路上是否有等待的Tk陷阱。 在等待社區智慧的同時,我可能會同時嘗試兩者。

我個人的經驗法則是除非嚴格要求,否則應避免使用螺紋。 線程增加了復雜性。 另外,有很大一部分程序員不是特別精通線程,因此如果該程序將由其他人使用或維護,則線程會增加風險。

話雖這么說,在這種特殊情況下,我想我應該使用線程+隊列。 由於您知道顯示器應該多久更新一次,因此我將每10毫秒左右對隊列進行一次輪詢,以更新小部件。

我只是通過在我的原始實現中更改了8行代碼來實現了#2(函數+ .after(1,函數)),它可以完美地運行。 因此,第二名基於簡單性和有效性而獲勝。 它使用1%內核的3-4%(i5-2500,3.3 GHz)運行

但是,如果我的UI變得更加復雜(例如,通過matplotlib動畫添加剝離圖記錄),則可能需要隊列和單獨的獲取線程。 但不是今天!

編輯:但是不要使用.after(0,...):嘗試時我的UI鎖定了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM