Python线程在设置停止标志时持续执行

0 投票
1 回答
759 浏览
提问于 2025-04-18 16:17

我正在使用Python 2.6通过串口与一个设备进行通信。我想每10秒确认一下设备是否还在工作。我找到的最好方法是启动一个线程,定期向设备发送“检查”信号(之后还会有其他方法发送配置命令,所以需要用到全局变量)。下面是我根据这个链接写的代码。

当我输入“quit”时,ConnectionThread似乎只停止了10秒的计时器,却不停地发送PING消息。是什么原因导致的,我该如何结束整个线程呢?

import serial
import threading

ser = 0

class ConnectionThread(threading.Thread):
    def __init__(self, event, **kwargs):
        threading.Thread.__init__(self)
        self.stopped = event
        for key, value in kwargs.items():
            setattr(self, key, value)

    def run(self):
        while not self.stopped.wait(10):
            ser.write("{0},{1}\r".format(self.name,"PING"))

def main():           
    global ser
    commport = input("Enter COM port:")

    try:            
        ser = serial.Serial(
                            port = 'COM{0}'.format(commport),
                            baudrate = 9600
                            )
    except:
        print "Unable to open com port!"

    stopFlag = threading.Event()
    thread = ConnectionThread(stopFlag)
    thread.start()  

    while True:
        n = raw_input("Enter input:")
        if n == "quit":
            stopFlag.set()
            break

if __name__ == "__main__":
    main()

1 个回答

1

因为你在使用Python 2.6,所以Event.wait()总是返回None。你需要在你的循环里明确检查一下Event的状态:

while not self.stopped.wait(10):
    if self.stopped.isSet():
        return
    ser.write("{0},{1}\r".format(self.name,"PING"))

撰写回答