将多个信号连接到

时间:2016-03-09 18:26:39

标签: python multithreading user-interface pyqt

我目前正在研究控制系统GUI,并且在跨线程存储和访问数据时遇到了障碍。目前,我正在读取仪表的压力,并在UI中更新LCD显示器,工作正常。我遇到的这个问题是当我试图控制我的系统时。我需要在同时更新压力显示的同时实时访问我的控制回路的压力表数据,但是如果我同时尝试两个命令(控制反馈和显示)到量规,我会得到串行读取错误。因此,我想知道是否有一种很好的方法可以让一个功能只是读取仪表的数据,存储它,并在必要时将数据发送到压力显示和控制功能。这是我的简化代码:

Class MainWindow():

#has a bunch of buttons and images that are used
#Define the threading object
self.obj=Reader.worker()
self.thread=QThread()
self.obj.moveToThread(self.thread)

def PresDisplay(self,i):
     self.presNumber.display("%s", i)

def on_presReadButton_clicked(self):
     self.obj.intReady.connect(self.presDisplay)
     self.thread.started.connect(self.obj.collector)
     self.thread.start()

这部分代码都运行良好。但是,从这里开始,我有点失去了我应该做的事情。在我的工人班,我有以下几点: #

类工作者(QObject):

  intReady=pyqtSignal(str)
  pres=pyqtSignal(str)

  def collector(self):
    while True:
        i=gauge.check()   #read the pressure from the gauge
        self.pres.connect(self.presSender)
        self.pres.emit(i)

  def presSender(self,i):
        self.intReady.emit(i)

  def control(self, setpoint, i):
     #This method must take in the pressure setpoint from the main GUi thread and use the pressure readings from collector at any given time to conduct the close loop control. It will be initiated from the click of a button (not the pressure read button above)

我知道这是一个非常开放的问题,但可能有很多方法可以解决它。

如果有人有任何想法,我愿意尝试一下。我一直试图在三周的大部分时间里解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可能不希望在循环的每次迭代中重新连接信号。它会创建重复的连接,每次发出信号时都会多次调用相同的回调

while True:
    i=gauge.check() 
    self.pres.connect(self.presSender) # This is bad
    self.pres.emit(i)

您通常只想连接一次信号,通常是__init__方法。在这种情况下,您发出的信号(pres)只是为了发出具有完全相同参数(intReady)的另一个信号。只需摆脱pres信号并直接从intReady方法发出collector

while True:
    i=gauge.check()   #read the pressure from the gauge
    self.intReady.emit(i)

此外,我不确定gauge.check()需要多长时间才能做出响应,但您可能希望在每次迭代时插入sleep,这样您就不会经常用数百万个信号向主线程发送垃圾邮件当你只需要1-10赫兹的分辨率时。

while True:
    i=gauge.check()   #read the pressure from the gauge
    self.intReady.emit(i)
    QtCore.QThread.msleep(100)

主线程也是如此。您可能不希望连接信号并在按下按钮的每个时间重新启动线程。将on_click处理程序中的所有内容移动到__init__方法中,或者检查以仅连接信号并启动线程(如果尚未完成)。