在 Python 中暂停和恢复 QThread

问题描述 投票:0回答:0

我正在使用 Python、PyQt5、QThread。 İ 有 GUİ 显示来自传感器的注册对象。连接方案——传感器+Arduino+PC。

import serial
import glob
import datetime
# from serial import Serial
import sys

from PyQt5.QtWidgets import (QDialog, QApplication, QWidget, QPushButton,
                             QComboBox, QVBoxLayout, QCheckBox, QLCDNumber,
                             QSlider, QProgressBar, QHBoxLayout, QLabel)
from PyQt5 import QtCore
from PyQt5.QtCore import QThread, pyqtSignal, QTimer

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt

timespan = 10000
load = [0] * timespan
production = [0] * timespan
pdc = [0] * timespan


class WorkerThread(QThread):
    # mysignal_i=pyqtSignal( int, name='Signal_i') ### 1) declare the signal
    measurements_signals = pyqtSignal(int, float, name='m_signals')

    def __init__(self, parent=None):
        QThread.__init__(self)


    def run(self):
        print('reading')
        a = 100  # 
        fq = [0] * a
        tot = 0
        sum = 0
        v = 0.0
        ser = serial.Serial(
            port='COM4',  # use "dmesg | grep tty" to find out the port
            baudrate=9600,
            bytesize=serial.EIGHTBITS,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE
        )
        while ser.isOpen():

            c = ser.readline().decode('ASCII')
            if c == '':
                pass
            else:
                i = int(c)
                sum -= fq[0]
                for j in range(1, a):
                    fq[j - 1] = fq[j]
                tot += i
                fq[a - 1] = i * 10
                sum += fq[a - 1]
                v = float(sum) / a
                self.measurements_signals.emit(int(tot), float(v))

        ser.close()
    def pause(self):
        self.sleep(10)
        print('sleep')
    def stop(self):
        # self.ser.close()
        self.terminate()
        print("stop")

class Window(QWidget):
    def __init__(self, parent=None):

        super(Window, self).__init__(parent)
        self.setGeometry(100, 100, 300, 200)  # pos pos width height

        self.PortLabel = QLabel("Port:")
        self.LabelProd = QLabel("Total:")
        self.LabelLoad = QLabel("Frequency:")

        port_selectBox = QComboBox(self)
        ports = self.available_serial_ports()

        for port in ports:
            port_selectBox.addItem(port)

        self.buttonConnect = QPushButton('Start')
        self.buttonPause = QPushButton('Pause')
        self.buttonStop = QPushButton('Stop')

        self.lcdProd = QLCDNumber(self)
        self.lcdLoad = QLCDNumber(self)
        self.lcdProd.setFixedHeight(100)
        self.lcdLoad.setFixedHeight(100)

        self.figure_timeseries = plt.figure()

        self.canvas_timeseries = FigureCanvas(self.figure_timeseries)
        # --------------------------- Layout

        col1 = QVBoxLayout()
        col1.addWidget(self.PortLabel)
        col1.addWidget(port_selectBox)
        col1.addWidget(self.buttonConnect)
        col1.addWidget(self.buttonPause)
        col1.addWidget(self.buttonStop)


        col2 = QVBoxLayout()
        col2.addWidget(self.LabelProd)
        col2.addWidget(self.lcdProd)
        col2.addWidget(self.LabelLoad)
        col2.addWidget(self.lcdLoad)

        toprow = QHBoxLayout()
        toprow.addLayout(col1)
        toprow.addLayout(col2)

        layout = QVBoxLayout()
        layout.addLayout(toprow)
        layout.addWidget(self.canvas_timeseries)

        self.setLayout(layout)

        # --------------------------------------
        self.wt = WorkerThread()  # This is the thread object
        self.buttonConnect.clicked.connect(self.wt.start)
        # Connect the signal from the thread to the slot_method
        self.wt.measurements_signals.connect(self.slot_method)  ### 3) connect to the slot

        self.buttonPause.clicked.connect(self.wt.pause)
        self.buttonStop.clicked.connect(self.wt.stop)


        timespan = 600
        load = [0] * timespan
        production = [550] * timespan
        pdc = [0] * timespan

    def slot_method(self, p, l):
        print("p =", p)
        print('l =', l)
        self.lcdProd.display(p)
        self.lcdLoad.display(l)
        self.update_chart_timeseries(p, l)

    def update_chart_timeseries(self, produzione, carico):  # time series
        # load.pop(0)
        # load.append(carico)
        production.pop(0)
        production.append(produzione)

        self.figure_timeseries.clear() 
        plt.figure(num=self.figure_timeseries.number)  
        plt.plot(production, color="b")
        # plt.plot(load, color="r")
        # plt.set_ylim([0,max(load, production)])
        plt.ylim(ymin=0)
        plt.legend(['PV'], loc='upper left')
        self.canvas_timeseries.draw()

    def available_serial_ports(self):
        ports = ['COM%s' % (i + 1) for i in range(256)]
        result = []
        for port in ports:
            try:
                s = serial.Serial(port)
                s.close()
                result.append(port)
            except (OSError, serial.SerialException):
                pass
        return result


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Window()
    main.show()
    sys.exit(app.exec_())

但我正在尝试暂停和恢复线程。我希望当我单击按钮暂停时,注册将停止,单击开始后注册将继续。 例如:在点击 reg obj: 56 之前点击 start 之后将继续 56+..... 我尝试使用 wait() 和 sleep() QThread 函数,但它无法正常工作。

python multithreading pyqt5 qthread
© www.soinside.com 2019 - 2024. All rights reserved.