【发布时间】:2014-09-29 19:23:57
【问题描述】:
我正在使用 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()
【问题讨论】:
-
所以在你“退出”之前,它工作正常,但之后,它只是无限地“ping”?
-
正确。 “退出”后,ping 消息会连续发送,没有 10 秒延迟。
-
@Oilyraincloud 如果您删除此串行端口部分,并且仅删除该循环中的
print某些内容,是否还会发生这种情况?我无法从我的机器上以这种方式复制它。 -
您使用的是哪个版本的 Python?在 2.7 之前,Event.wait() 总是返回 None。在我的系统上使用 python 2.7 可以正常工作。
-
我支持@JonathanVillemaire-Krajden。使用 Python 2.7 我无法重现,但使用 2.6 我可以。也许在
while循环中添加一个if self.stopped.isSet(): return,看看问题是否消失?
标签: python multithreading python-2.6 pyserial