停止python线程的执行并启动一个新线程
我目前正在研究Python中的一些设计模式,并尝试实现图中的状态模式示例: [编辑:最初的问题是@jaykip发现的。我在打开/关闭对象实例化中传递wrng对象,现在我只想用按钮取消打开/关闭过程] 它比我想象的要复杂得多,我为四个状态和停止python线程的执行并启动一个新线程,python,design-patterns,python-multithreading,Python,Design Patterns,Python Multithreading,我目前正在研究Python中的一些设计模式,并尝试实现图中的状态模式示例: [编辑:最初的问题是@jaykip发现的。我在打开/关闭对象实例化中传递wrng对象,现在我只想用按钮取消打开/关闭过程] 它比我想象的要复杂得多,我为四个状态和open和close方法中的每一个创建了一个类。为了模拟打开和关闭按钮,我使用了pynput模块,这样我可以听键盘并调用Open和Close按钮,为了模拟打开和关闭车门传感器,我只需调用sleep功能等待3秒钟,直到车门关闭/打开 它工作正常,直到我决定使用线
open
和close
方法中的每一个创建了一个类。为了模拟打开和关闭按钮,我使用了pynput
模块,这样我可以听键盘并调用Open
和Close
按钮,为了模拟打开和关闭车门传感器,我只需调用sleep
功能等待3秒钟,直到车门关闭/打开
它工作正常,直到我决定使用线程,以便sleep
函数调用不会阻止主程序,并且我可以在门关闭/打开时“按下按钮”。现在,国家并没有像人们想象的那样发生变化。下面是代码和运行示例:
from time import sleep
from pynput import keyboard
from threading import Thread
class Open():
def __init__(self, door):
self.door = door
print('Open')
def open(self):
pass
def close(self):
self.door.state = Closing(self.door)
for _ in range(3):
print('.', end='', flush=True)
sleep(1)
self.door.state = Closed(self.door)
class Opening():
def __init__(self, door):
self.door = door
print('Opening', end='')
def open(self):
pass
def close(self):
self.door.state = Closing(self.door)
for _ in range(3):
print('.', end='', flush=True)
sleep(1)
self.door.state = Closed(self.door)
class Closed():
def __init__(self, door):
self.door = door
print('Closed')
def close(self):
pass
def open(self):
self.door.state = Opening(self.door)
for _ in range(3):
print('.', end='', flush=True)
sleep(1)
self.door.state = Open(self.door)
class Closing():
def __init__(self, door):
self.door = door
print('Closing', end='')
def close(self):
pass
def open(self):
self.door.state = Opening(self.door)
for _ in range(3):
if type(self.door.state) == Opening:
print('.', end='', flush=True)
sleep(1)
self.door.state = Open(self.door)
class ElevatorDoor:
def __init__(self):
self.state = Open(self)
def open(self):
Thread(target=self.state.open).start()
def close(self):
Thread(target=self.state.close).start()
if __name__ == '__main__':
door = ElevatorDoor()
def on_press(key):
global door
if key == keyboard.Key.esc:
return False # stop listener
try:
k = key.char # single-char keys
except Exception:
k = key.name # other keys
if k == 'o':
door.open()
if k == 'c':
door.close()
listener = keyboard.Listener(on_press=on_press)
listener.start()
listener.join()
事情就是这样发生的:
<initial state is Open>
Open
<press 'c' key>
Closing...Closed
<wait it finishes and press 'o' key>
Opening...Open
<press 'c' key and while closing press 'o' key>
Closing..Opening...Closed
Open
打开
结束…结束
打开…打开
结束…开始…结束
打开
关于如何取消先前的关闭线程,这样它就不会改变状态到CLDES,并在打开过程中间打印“关闭”? < P>看起来你正在通过<代码>打开/代码>等对象作为下一个状态对象的参数。在
close
功能中,它设置self.door.state=Closed(self)
,其中self
是Open
对象Closed
正在查找要工作的ElevatorDoor
对象。试试self.door
取而代之:)我找不到pynput模块,所以我无法测试它,但我希望这能有所帮助。哇,这是个愚蠢的错误哈哈哈,谢谢!我已经修好了,几乎可以用了。我只需要找到一种方法,在按下关闭按钮时停止打开过程,反之亦然