периодически запускать 4 функции в фоновом режиме без зависания графического интерфейса - PullRequest
0 голосов
/ 02 октября 2019

Я создал скрипт pyqt5, который использует python3.6. Мои скрипты получают ввод с последовательного устройства и обновляют графический интерфейс и удаленную базу данных, а также принимают удаленный ввод из веб-браузера и вносят необходимые изменения в последовательное устройство и соответственно обновляют графический интерфейс. Я использую QTimer для запуска 4 функций / методов в фоновом режиме, чтобы добиться этого, и это работает. Но проблема в том, что после получения ручного ввода или удаленного ввода (из веб-браузера) для внесения необходимых изменений в последовательном устройстве и графическом интерфейсе требуется почти 15-20 секунд, и это делает графический интерфейс практически не отвечающим (он реагирует после почти 15-20 секунд). Я пробовал QThread, но он всегда приводит к множественному доступу к последовательному порту одновременно, что приводит к сбою сценария. Пожалуйста, помогите мне в этом.

from PyQt5.QtCore import QTimer, QThread
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import os
import sys
import time
import serial
import MySQLdb
from pathlib import Path
import json


ui, _ = loadUiType('myapplication.ui')


class MainApp(QMainWindow, ui):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)

    def new_method1(self):
        print("This is new_method1")

    def new_method2(self):
        print("This is new_method2")

    def new_method3(self):
        print("This is new_method3")

    def new_method4(self):
        print("This is new_method4")

    def continuous_calling(self):            
        self.timer = QTimer()
        self.timer.timeout.connect(self.new_method1)
        self.timer.start(1000)
        self.timer.timeout.connect(self.new_method2)
        self.timer.start(1000)
        self.timer.timeout.connect(self.new_method3)
        self.timer.start(1000)
        self.timer.timeout.connect(self.new_method4)
        self.timer.start(1000)

def main():
    app = QApplication(sys.argv)
    window = MainApp()
    window.move(0, -30)
    window.show()
    window.continuous_calling()
    app.exec_()



if __name__ == '__main__':
    main()

Здесь я хочу непрерывно запускать методы new_method1, new_method2, new_method3 & new_method4 в фоновом режиме до тех пор, пока графический интерфейс не завершится, не заморозив графический интерфейс. Спасибо.

дополнительная информация :: Это пример других функций, которые управляют прямым пользовательским вводом из GUI (нажатие кнопок из GUI). И эти функции не работают в фоновом режиме неоднократно. Эти функции запускаются только при нажатии кнопок (в графическом интерфейсе).

def ser_conn_on_zero(self):
    self.ser = serial.Serial(
        port=self.comm_port,
        baudrate=9600,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_EVEN,
        stopbits=serial.STOPBITS_ONE,
        timeout=1)
    if self.ser.isOpen():
        print("Open: " + self.ser.name)
        self.ser.flushInput()
        self.ser.flushOutput()
        self.ser.close()
    self.ser.open()
    print('Connected to :' + self.comm_port)
    print("Turning ON Relay Zero")
    self.ser.write(b'\x46\x6D\x45\x63\x73\x4B\x6F\x6C\x00\x05\x00\x01\x00\x01\x00\r\n')
    output = self.ser.readline().decode('iso-8859-1')
    print("Serial Response: " + output)
    self.ser.close()
    print("Serial connection Closed for Relay Zero")
    conn = MySQLdb.connect("XX.XX.XX.XX", "User2", "PASSWORD", "TestSite_001", use_unicode=True, charset="utf8")
    cursor = conn.cursor()
    try:
        cursor.execute("update some_table set chn = %s where id = %s", (1, 1))
        conn.commit()
    except MySQLdb.Error as e:
        print("ser_conn_on_zero: couldn't update the remote database : ", str(e))
    cursor.close()
    conn.close()
...