如何立即打破while循环

2024-09-30 06:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一门课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





Tags: 函数runimportselfdata界面mydef
1条回答
网友
1楼 · 发布于 2024-09-30 06:34:23

我认为一个简单而健壮的方法是在串行端口上配置一个相当短的读取超时(~1秒)。您只需测试是否len(data) == 0,而不进一步处理(非)传入数据

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

相关问题 更多 >

    热门问题