pyqt: 關於近期遇到的多線程問題+多線程方案

問題描述:

寫了一個小應用,有兩個控件一個播放攝像頭視頻,一個固定時間間隔顯示的算法檢測過的圖片(圖片實時從攝像頭讀取)。

最開始做的方案是:一個線程負責採集攝像頭的圖像數據流,

                                        一個線程負責把數據流的圖片顯示到控件上,

                                        在主線程進行算法運算。

但是,每次主線程做算法運算的時候顯示控件就會卡頓。

這裏主線程做了兩件事,一件是負責了主邏輯和算法模型的計算。

因此,博主做了另外一個方案:

單獨做一個線程負責算法的計算,把顯示的QT程序和主邏輯放到了主線程上,想通過把顯示作爲主線程來解決卡頓問題。

結果還是不行,運算的時候顯示控件仍然會卡。

解決方式和原因:

最後博主對數據流進行追蹤,去找顯示控件是卡在哪一步了,追蹤發現顯示控件卡在update之前,這意味着圖像數據一直在更新,

同時也生成了圖片,就是沒有顯示,博主在查閱了多方資料後猜測可能是PyQt在使用多線程的時候資源分配不平衡,同時得知PyQt的GUI程序是不會在同一時間出現兩個線程同時運行,而是不同的線程之間輪流交換python解釋器的控制權,在同一個線程之中QT程序比python代碼更具優先使用權,除非在不同線程中,那麼問題就好解釋了雖然顯示程序和主邏輯在同一個線程中,但是主邏輯存在大量定時器和循環,在邏輯進入耗時代碼的時候,解釋器的控制權無法回到顯示程序的手上。

解決方法是把所有耗時程序都放到多線程中運行,只留下顯示控件的代碼作爲主線程。

參考來源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章