如何立即中断while循环

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

我有这个课程ScaleWorker

这是在主界面中的线程中运行的工作程序它包含receave_scaledata,它等待从设备接收数据并将其转发到接口该函数在while循环中运行条件为while my_serial.is_open and self.continue_run:与功能

def stop_me(self):
        self.continue_run = False

当从主接口发送信号以执行stop_me时,可以停止该功能self.continue_run = True切换为True,循环中断最后它发出self.finishedworking.emit()告诉主界面中的线程退出

self.scaleworker.finishedworking.connect(self.thread.quit)

问题在于,函数receave_scaledata包含pyserial中的函数data_left = my_serial.inWaiting()此功能永远等待直到接收数据没有输入数据,其他代码将无法执行因此,当发送信号以退出线程时,信号将被阻塞,直到数据进入设备,然后循环中断

[我正在寻找一种方法来告诉工作人员立即发出finishedworking而不会被阻止到目前为止,我找不到解决方法

在不使用设备的情况下很难执行代码,但是也许您可以帮我

这里是代码

import sys
import time

import re
import serial
from serial.tools import list_ports

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc



class ScaleWorker(qtc.QObject):

    work_signal = qtc.pyqtSignal(float)
    finishedworking = qtc.pyqtSignal()  # emmits that its finished

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.continue_run = False

    @qtc.pyqtSlot()
    def receave_scaledata(self):
        try:
            my_serial = serial.Serial(
                port="COM 3",
                baudrate=2400,
                bytesize=7,
                parity=serial.PARITY_NONE,
                timeout=None,
                stopbits=1,)

            if my_serial.is_open:
                print("serial open")

                while my_serial.is_open and self.continue_run:
                    data = my_serial.read()  # wait forever till data arives
                    time.sleep(1)  # hard delay to receave all bites
                    data_left = my_serial.inWaiting()  # wait forever
                    data += my_serial.read(data_left) # pack all receaved bites into on variable
                    self.work_signal.emit(data)
                self.finishedworking.emit()

        except serial.serialutil.SerialException:
            print("not open")

    def stop_me(self):
        self.continue_run = False




python while-loop pyqt5 nested-loops pyserial
1个回答
0
投票

一种简单而强大的方法是在串行端口上配置一个相当短的读取超时(〜1秒)。您只需要测试是否len(data) == 0,就不必进一步处理(非)传入数据。

这样,您可以确保至少在每次发生超时时都能够测试停止请求。

© www.soinside.com 2019 - 2024. All rights reserved.