保持键会阻塞其他线程吗?

时间:2021-03-23 19:09:10

标签: multithreading pyqt pyserial

我正在使用 pyserial 与我的 arduino 通信。我使用 Pyqt 作为 GUI。 我已经实现了一个监听串口的工作线程:

class Worker(QObject):
    finished = pyqtSignal()
    intReady = pyqtSignal(str)
    s_connect = pyqtSignal()
    s_position = pyqtSignal(str)
    s_console = pyqtSignal(str)
    s_infoPosSpeed = pyqtSignal(list)

    @pyqtSlot()
    def __init__(self):
        super(Worker, self).__init__()
        self.working = True
        self.ser = None

    def setSer(self, ser):
        self.ser=ser

    def work(self):
        message = ""
        while self.working:

            line = self.ser.readline().decode('utf-8')
            if(line!= ""):
                message +=line
            message=message.strip()
            if message != "" and ";" in message:
                i = message.index(";")
                print("newMessage=>",message)
                subString = message[0:i]
                if subString == "connack":
                    self.s_connect.emit()
                    self.s_console.emit("Verbindung hergestellt")
                message = message[i+1:]

            print(time.clock())
            time.sleep(0.1)
        self.finished.emit()

一般来说效果很好。然后我从主窗口打开一个对话框。我正在使用函数 keyPressEvent 来检测键盘上的按键:

def keyPressEvent(self, event):
    pressed = event.key()
    if event.isAutoRepeat():
        return
    if pressed == LEFT:
        self.b_left.setEnabled(False)
        self.parent.ser.write("left;".encode())
    if pressed == RIGHT:
        self.b_right.setEnabled(False)
        self.parent.ser.write("right;".encode())
    if pressed == UP:
        self.b_up.setEnabled(False)
        self.parent.ser.write("up;".encode())
    if pressed == DOWN:
        self.b_down.setEnabled(False)
        self.parent.ser.write("down;".encode())
    event.accept()

只要我按下一个键,工作线程就会停止工作。我明白这是因为 print(time.clock()) 在松开按键后停止并继续。

这是已知行为还是因为我的实现?

谢谢

0 个答案:

没有答案