создать несколько потоков для чтения и записи с PyQt5 - PullRequest
0 голосов
/ 01 апреля 2020

Я пишу код с PyQt5 для отправки и получения данных через последовательный порт. когда кнопка нажата, данные отправляются без проблем. при приеме длина пакета данных различна во всех случаях, и время между любыми отправками является случайным. Я создаю поток для чтения буфера последовательного порта в то время как l oop, и если данные были получены, то поместите это в глобальную очередь. в другом потоке очередь будет проверена, и если она не пуста, будет выполнен какой-то процесс с данными. но когда я тестирую программу и отправляю данные в приложение, ниже отображаются сообщение об ошибке и приложение cra sh. ошибка:

QObject: Невозможно создать дочерние элементы для родителя, который находится в другом потоке. (Parent - QTextDocument (0x1d1166f7620), родительский поток - QThread (0x1d116712ff0), текущий поток - QThread (0x1d1166f7560)

, здесь основная часть кода:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.QtWidgets import *
import errordialog as D1 
import serial 
import serial.tools.list_ports 
import threading
import queue


class Ui_Form(threading.Thread):
def __init__(self):
    threading.Thread.__init__(self)

def setupUi(self, Form):

    self.q = queue.Queue()
    .
    .
    .

def open_port(self):

    if self.comboBoxPORT.count()==0:
        dialog.exec_()
    else:
        self.ser.port = self.comboBoxPORT.currentText()
        b=int(self.lineEditBaudrate.text())
        if b==0:
            self.ser.baudrate = 9600
        else:
            self.ser.baudrate = int(self.lineEditBaudrate.text())

        try:
            self.ser.open()
            self.pushButtonClose.setEnabled(True)
            self.pushButtonOpen.setEnabled(False)
            self.pushButtonOpen.setStyleSheet("background-color: lime")
            self.pushButtonSend.setEnabled(True)
            self.comboBoxPORT.setEnabled(False)
            self.lineEditBaudrate.setEnabled(False)
            self.textEditReceived.setReadOnly(False)
            g=threading.Thread(target=ui.read_data)
            e=threading.Thread(target=ui.printData)
            g.start()
            e.start()                
        except:
            dialog.exec_()

def read_data(self):
    while True:
        t = self.ser.read().decode()
        if t:            
            self.q.put(t)

def printData(self):
    while True:
        while not self.q.empty():
            print(self.q.get())
            self.textEditReceived.setText(self.q.get())

def close_port(self):
    try:
        self.ser.close()
        self.pushButtonClose.setEnabled(False)
        self.pushButtonOpen.setEnabled(True)
        self.pushButtonOpen.setStyleSheet("background-color: azure")
        self.pushButtonSend.setEnabled(False)
        self.comboBoxPORT.setEnabled(True)
        self.lineEditBaudrate.setEnabled(True)
    except:
        dialog.exec_()

def send(self):
    self.ser.write(str.encode(self.textEditSent.toPlainText()))

 if __name__ == "__main__":
     import sys
     app = QtWidgets.QApplication(sys.argv)
     Form = QtWidgets.QWidget()
     ui = Ui_Form()
     ui.setupUi(Form)
     Form.show()
##============= add error dialog
    d1 = D1.Ui_DialogError()
    dialog = QtWidgets.QDialog()
    d1.setupUi(dialog)
##---======================----------
    ui.pushButtonOpen.clicked.connect(lambda : ui.open_port())
    d1.pushButtonCanceError.clicked.connect(lambda: dialog.close())
    ui.pushButtonExit.clicked.connect(lambda: Form.close())
    ui.pushButtonClose.clicked.connect(lambda: ui.close_port())
    ui.pushButtonSend.clicked.connect(lambda: ui.send())
##=============-----------------
##----------====================

    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...