设置停止标志时,Python线程会不断执行

时间:2014-08-06 18:25:31

标签: python multithreading python-2.6 pyserial

我使用Python 2.6与串口上的设备通信。我想确保设备每10秒仍然有效。我发现这样做的最好方法是启动一个经常ping设备的线程(其他方法,稍后设计,将配置命令发送出串口,因此全局)。以下是我的代码灵感来自here

当我进入“退出”时,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 个答案:

答案 0 :(得分:1)

由于您使用的是Python 2.6,Event.wait()始终会返回None。您需要明确检查while循环中Event的状态:

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