Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Raspberry Pi 2上的PyQt GUI运行缓慢_Python_Multithreading_User Interface_Pyqt_Raspberry Pi2 - Fatal编程技术网

Python Raspberry Pi 2上的PyQt GUI运行缓慢

Python Raspberry Pi 2上的PyQt GUI运行缓慢,python,multithreading,user-interface,pyqt,raspberry-pi2,Python,Multithreading,User Interface,Pyqt,Raspberry Pi2,最近我接到一个项目,在Raspberrypi2上开发一个GUI来控制一台机器。我对Qt GUI和Qthreads没有太多经验,所以请耐心听我说 我使用Qt4和Python开发GUI和底层程序 这个程序在我的电脑上运行得相当顺利,没有任何问题。我使用线程,一切都运行得很好,直到我用控制机器的Raspberryp2进行了尝试 它有一个Qthread,它从一个摄像头抓取一个帧,并使用标签显示它。这工作正常,但不会实时更新(更新速度非常慢)。 我有几个控制机器轴运动的按钮,在一个Qthread中运行,并

最近我接到一个项目,在Raspberrypi2上开发一个GUI来控制一台机器。我对Qt GUI和Qthreads没有太多经验,所以请耐心听我说

我使用Qt4和Python开发GUI和底层程序

这个程序在我的电脑上运行得相当顺利,没有任何问题。我使用线程,一切都运行得很好,直到我用控制机器的Raspberryp2进行了尝试

它有一个Qthread,它从一个摄像头抓取一个帧,并使用标签显示它。这工作正常,但不会实时更新(更新速度非常慢)。 我有几个控制机器轴运动的按钮,在一个Qthread中运行,并且还想将另一个Qthread与一个程序结合起来,该程序有一组特定的机器指令

这一切似乎都能工作,但机器的响应非常慢(有时按下按钮时执行单个命令需要5秒钟)。我已经对它进行了调试,并将其追溯到GUI

另请注意:程序运行时RaspberryPi 2的CPU使用率约为30-35%。。。。所以它并没有耗尽CPU

有人能告诉我我做错了什么吗。我怀疑这与线程执行和排队有关

我已附上以下代码示例:

类IO_工作者(QtCore.QThread):
def左移(自):
打印“左移”
RPIO.输出(4,0)#这是方向开关的针脚7(低西)
RPIO.output(15,0)#这是中间拨动开关的针脚10
RPIO.output(18,0)#这是插脚12顶部拨动开关Dirno=4
时间。睡眠(.05)
RPIO.output(23,1)#接下来的三行按下x阶段的蓝色Go按钮
睡眠时间(0.2)
RPIO.输出(23,0)
def右移动(自身):
打印“移动权限”
RPIO.输出(4,1)#这是方向开关的针脚7(低西)
RPIO.output(15,0)#这是中间拨动开关的针脚10
RPIO.output(18,0)#这是插脚12顶部拨动开关Dirno=4
时间。睡眠(.05)
RPIO.output(23,1)#接下来的三行按下x阶段的蓝色Go按钮
睡眠时间(0.2)
RPIO.输出(23,0)
类frameGrabber(QtCore.QThread):
定义初始化(self,cameraID=0):
QtCore.QThread.\uuuu init\uuuuu(self)
self.cameraID=cameraID
def运行(自):
cap=cv2.VideoCapture(self.cameraID)
封盖套件(cv2.cv.cv\u封盖\u支架\u宽度,320)
封盖套件(cv2.cv.cv\u封盖\u支架\u高度,180)
虽然(正确):
睡眠时间(0.25)
ret,frame=cap.read()
高度、宽度、深度=frame.shape
#打印“H:”,高度,“W:”,宽度
frame=QtGui.QImage(frame.tostring(),宽度,高度,QtGui.QImage.Format_RGB888).rgbSwapped()
自发射(QtCore.SIGNAL('webcam_frame(QImage)),帧)
主类(QtGui.QMainWindow):
def uuu init uuu(self,parent=None):
QtGui.QMainWindow.\uuuuu init\uuuuu(self,parent)
self.ui=ui\u主窗口()
self.ui.setupUi(self)
##初始化IO(树莓皮GPIO)
self.InitIO(self.ui)
##设置信号
self.SetupSignals()
类初始化(QtCore.QThread):
定义初始化(自我,用户界面):
打印“IO已初始化”
RPIO.setmode(RPIO.BCM)
RPIO.cleanup()
RPIO.setup(21,RPIO.OUT,初始值=1)
RPIO.setup(20,RPIO.OUT,初始值=0)#LSB
RPIO.setup(16,RPIO.OUT,初始值=0)
RPIO.setup(12,RPIO.OUT,初始值=0)#
RPIO.setup(7,RPIO.OUT,初始值=0)#MSB
RPIO.setup(26,RPIO.IN,pull\u up\u down=RPIO.PUD\u up)
def RightAxis移动(自):
打印“向上移动”
IO_WorkerThread=IO_Worker()
IO_WorkerThread.MoveRight()
def LeftAxis移动(自):
IO_WorkerThread=IO_Worker()
IO_WorkerThread.MoveLeft()
def ProcessCamFrame(自身,机架):
#打印“帧更新”,帧
pix=QtGui.QPixmap(帧)
pix=pix.scaled(self.ui.Video\u Out.size())
self.ui.Video_Out.setPixmap(pix)
def设置信号(自):
##############################################################
##启动相机线程
##############################################################
camWorker=frameGrabber()
camWorker.start()
QtCore.QObject.connect(camWorker,QtCore.SIGNAL(“网络摄像头帧(QImage)”),self.ProcessCamFrame)
IO_WorkerThread=IO_Worker()
IO_WorkerThread.start()
##############################################################
##听移动按钮类
##############################################################
self.ui.pButton_Left.clicked.connect(self.LeftAxisMovement)
self.ui.pButton_Right.clicked.connect(self.rightaxismotation)
##---------------------------------------------------------------------
如果名称=“\uuuuu main\uuuuuuuu”:
app=QtGui.QApplication(sys.argv)
window=Main()
window.show()
sys.exit(app.exec_())

我会尽可能避免线程。使用
QTimer
代替抓帧线程。IO_Worker并不是代码中的线程。它继承自thread类,但您从未在此类线程中执行任何代码。谢谢BlackJack。。。你能举个例子说明如何使用QTimer吗?非常感谢。至于IO_工人。。。当按下按钮时,该命令仍会执行(只需花费大量时间)。我假设这是因为它仍然不在线程中执行。
QTimer
非常简单。创建一个,将
timeout()
信号与应该定期调用的函数或方法连接,然后
start()
以毫秒为单位指定间隔的计时器。这可以取代
帧抓取器
cla中的
while
循环