2016-11-28 185 views
0

我嘗試在程序中啓動Qthread和另一個線程。代碼如下所示。 Qthread必須顯示圖形。 Qthread單獨工作時很好,但是當我嘗試運行一個線程或多個Qthread時,它不顯示任何內容。使用QThread和線程模塊進行Python多線程處理

我的設置:的Ubuntu 16.04.1 LTS,蟒蛇2.7.12

模塊:pyqtgraph,時間,numpy的,SYS,穿線

的QThread:plotthread.py

from pyqtgraph.Qt import QtGui, QtCore 
import pyqtgraph as pg 
import numpy as np 
import time 
import sys 
class guiThread(QtCore.QThread): 
    def __init__(self): 
     QtCore.QThread.__init__(self) 
     self.status=True 
     self.range=100 
     self.app = QtGui.QApplication(sys.argv) 
     self.app.aboutToQuit.connect(self.stop) 
     self.win = pg.GraphicsWindow(title="Example") 
     self.win.resize(500,400) 
     pg.setConfigOptions(antialias=True) 
     self.px = self.win.addPlot(title="X plot") 
     self.ckx = self.px.plot(pen='y') 
     self.cdx = self.px.plot(pen='r') 
     self.px.setXRange(0, self.range) 
     self.px.setYRange(-180, 180) 
     self.px.showGrid(x=True, y=True) 
     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(self.updateplot) 
     self.timer.start(0.001) 
     self.kx=np.zeros(self.range) 
     self.dx=np.zeros(self.range) 

    def updateplot(self): 
     self.ckx.setData(self.kx) 
     self.cdx.setData(self.dx) 

    def append(self,sin): 
     self.kx=np.roll(self.kx,-1) 
     self.kx[-1]=sin[0] 
     self.dx=np.roll(self.dx,-1) 
     self.dx[-1]=int(sin[1]) 
    def stop(self): 
     print "Exit" #exit when window closed 
     self.status=False 
     sys.exit() 
    def run(self): 
     print "run" #Qthread run 
     while self.status: 
      sin=np.random.randint(-180,180,2) 
      self.append(sin) #append random number for plot 
      time.sleep(0.01) 

Python Threading:ptiming.py

import time 
import threading 

class timeThread (threading.Thread): 
    def __init__(self,name): 
     threading.Thread.__init__(self) 
     self.name=name 
     self.t=time.time() 
     self.elapsed=0 
    def run(self): 
     print "thread start" 
     while (1): 
      self.elapsed=time.time()-self.t 
      print self.name, self.elapsed 

主營:main.py

import ptiming 
import plotthread 
t1=plotthread.guiThread() 
t1.start() 
t2=ptiming.timeThread("t1") 
t2.start() 
+0

您是否嘗試在'guiThread'構造函數中添加'win.show()'? – mguijarr

+2

您不能在單獨的線程中執行任何類型的GUI操作。所有gui操作**必須在主線程中發生。 – ekhumoro

+0

@mguijarr是的,我在初始化和plotthread運行功能 – acs

回答

1

在你timeThread類中,.run()方法做一個繁忙的循環:它不斷地顯示經過的時間,沒有任何停頓所以CPU都瘋了,我猜OS那麼不調度另一個線程。

在這個循環中做一個time.sleep() - 應該恢復正常。

方面評論:你爲什麼要在guiThread類的構造函數中創建UI元素?使用Qt,無論如何,所有UI元素都屬於主線程。正如@ekhumoro所說,GUI操作必須在主線程中發生,這是你的代碼中的情況,儘管它是以令人困惑的方式編寫的。就我個人而言,我會在主線程中創建明顯的UI元素,並添加一個數據處理線程。