多執行緒環境下 PyQtGraph 繪畫解決方案
1、問題背景
2、解決方案
為了解決這個問題,可以採用以下解決方案:
-
將繪圖操作封裝成一個函式,並將其放入一個佇列中;
-
建立多個工作執行緒,並讓每個工作執行緒從佇列中獲取繪圖任務,然後在主執行緒中執行繪圖操作;
-
透過訊號和槽機制將工作執行緒和主執行緒連線起來,以便工作執行緒在完成繪圖任務後通知主執行緒更新 GUI 介面。
以下是一個示例程式碼,演示瞭如何使用上述解決方案來在多執行緒環境下進行 PyQtGraph 繪圖:
from PyQt5 import QtCore, QtWidgets
import pyqtgraph as pg
import threading
import Queue
# 建立一個繪圖物件
app = QtWidgets. QApplication([])
win = pg. GraphicsWindow( title = "Basic plotting examples")
plot = win. addPlot( title = "Simple plot", labels ={ 'left': 'Y Axis', 'bottom': 'X Axis'})
curve = plot. plot( curve = np. random. normal( size = 100))
# 定義繪圖函式
def draw( data):
curve. setData( data)
# 將繪圖函式封裝成一個類
class DrawingThread( threading. Thread):
def __init__( self, queue):
super( DrawingThread, self). __init__()
self. queue = queue
def run( self):
while True:
# 從佇列中獲取繪圖任務
data = self. queue. get()
# 在主執行緒中執行繪圖操作
QtCore. QMetaObject. invokeMethod( curve, "setData", QtCore. Qt. QueuedConnection,
QtCore. Q_ARG( object, data))
# 通知主執行緒更新 GUI 介面
QtCore. QMetaObject. invokeMethod( app, "processEvents", QtCore. Qt. QueuedConnection)
# 標記任務完成
self. queue. task_done()
# 建立一個佇列來儲存繪圖任務
queue = Queue. Queue()
# 建立多個工作執行緒
num_worker_threads = 3
for i in range( num_worker_threads):
thread = DrawingThread( queue)
thread. daemon = True
thread. start()
# 將繪圖任務放入佇列中
for i in range( 100):
queue. put( np. random. normal( size = 100))
# 啟動應用程式
app. exec_()
在這個示例中,我們建立了一個繪圖物件
curve
,並將其新增到 PyQtGraph 的繪圖視窗中。然後,我們定義了一個繪圖函式
draw()
,這個函式將資料
data
繪製到
curve
上。
接下來,我們將繪圖函式封裝成一個類
DrawingThread
。這個類繼承自
threading.Thread
,並重寫了
run()
方法。在
run()
方法中,我們從佇列中獲取繪圖任務,然後在主執行緒中執行繪圖操作。
最後,我們建立了一個佇列
queue
來儲存繪圖任務,並建立了多個工作執行緒來從佇列中獲取繪圖任務並執行繪圖操作。
在主執行緒中,我們透過訊號和槽機制將工作執行緒和主執行緒連線起來,以便工作執行緒在完成繪圖任務後通知主執行緒更新 GUI 介面。
透過這種方式,我們可以在多執行緒環境下進行 PyQtGraph 繪圖,並且不會出現繪圖不生效或程式崩潰的問題。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3008079/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒的安全問題及解決方案執行緒
- 多執行緒併發同步問題及解決方案執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- 靜態變數在多執行緒環境下的初始化是執行緒安全的嗎?變數執行緒
- Java指令重排序在多執行緒環境下的應對策略Java排序執行緒
- 多執行緒併發執行及解決方法執行緒
- laravel-MIX 非手冊環境下無法正常執行,解決方案記錄Laravel
- 用 UI 多執行緒處理 WPF 大量渲染的解決方案UI執行緒
- bash shell多執行緒方案執行緒
- 多執行緒下解決資源競爭的7種方法執行緒
- 多執行緒詳解執行緒
- 詳解多執行緒執行緒
- Nacos 解決 laravel 多環境下配置切換Laravel
- c# 多執行緒環境下控制對共享資源訪問的辦法C#執行緒
- 多執行緒03:?執行緒傳參詳解執行緒
- 有贊環境解決方案
- 多執行緒下的list執行緒
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- 多執行緒和多執行緒同步執行緒
- WAMP環境下如何安裝執行多個網站網站
- iOS 多執行緒詳解iOS執行緒
- Java多執行緒詳解Java執行緒
- 多執行緒--執行緒管理執行緒
- 執行緒與多執行緒執行緒
- 多執行緒【執行緒池】執行緒
- Java多執行緒:資料一致性問題及解決方案Java執行緒
- 多執行緒下載檔案執行緒
- ftp多執行緒下載工具FTP執行緒
- Java多執行緒下載分析Java執行緒
- vscode在Linux環境下執行“許可權不夠”的解決方法VSCodeLinux
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- 畫江湖之 PHP 多執行緒開發 【建立一個新的執行緒】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [建立一個新的執行緒]PHP執行緒
- 多執行緒下載工具 NeatDownloadManager下載執行緒
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒之初識執行緒執行緒