Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止python线程的执行并启动一个新线程_Python_Design Patterns_Python Multithreading - Fatal编程技术网

停止python线程的执行并启动一个新线程

停止python线程的执行并启动一个新线程,python,design-patterns,python-multithreading,Python,Design Patterns,Python Multithreading,我目前正在研究Python中的一些设计模式,并尝试实现图中的状态模式示例: [编辑:最初的问题是@jaykip发现的。我在打开/关闭对象实例化中传递wrng对象,现在我只想用按钮取消打开/关闭过程] 它比我想象的要复杂得多,我为四个状态和open和close方法中的每一个创建了一个类。为了模拟打开和关闭按钮,我使用了pynput模块,这样我可以听键盘并调用Open和Close按钮,为了模拟打开和关闭车门传感器,我只需调用sleep功能等待3秒钟,直到车门关闭/打开 它工作正常,直到我决定使用线

我目前正在研究Python中的一些设计模式,并尝试实现图中的状态模式示例:

[编辑:最初的问题是@jaykip发现的。我在打开/关闭对象实例化中传递wrng对象,现在我只想用按钮取消打开/关闭过程]

它比我想象的要复杂得多,我为四个状态和
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模块,所以我无法测试它,但我希望这能有所帮助。

哇,这是个愚蠢的错误哈哈哈,谢谢!我已经修好了,几乎可以用了。我只需要找到一种方法,在按下关闭按钮时停止打开过程,反之亦然