有什么办法可以在完成我的输入序列后摆脱我的超时倒计时线程? Python

如何解决有什么办法可以在完成我的输入序列后摆脱我的超时倒计时线程? Python

我正在开发一个程序,其中:

-我们有一个物体检测循环

- 它会空闲等待用户的输入。在第一次输入时,它将启动一系列需要完成的操作。如果用户离开并且还没有完成完整的序列,我需要找到一种方法来重置序列,以便新用户可以开始他们自己的序列。

我当前的“解决方案”是使用线程通过将线程指向以下函数来启动超时倒计时:

def timeout():
    count = 0
    t = 61
    while count <= 60:
        time.sleep(1)
        count += 1
        t -= 1
        to_queue.put(t)

函数将开始倒计时 60 秒,并将值放入我的队列 to_queue

实施后我意识到这不是最佳解决方案,因为如果我的用户(A)完成他们的序列而另一个(B)立即开始,前 60 秒仍将计数并结束序列对于第二个用户 (B) 来说太早了,因此可能会造成未完成序列的无限循环。

我的“重新启动”序列的标准在两个位置:完成后重置所有值,另一个if timeout == 0: reset sequence

我一直在查看队列和多线程的文档,但似乎找不到正确的解决方案。我知道线程不能被“杀死”,但我已经用完了关于如何在线“杀死线程”的示例。

我还看到线程库下有 Timer() 但我不确定如何实现它,因为它需要一个函数作为其参数,但我假设的 restartSequence() 函数需要重置位于在我的 Sequence() 函数中。我被困在这里,觉得我错过了一些非常明显的东西。任何帮助表示赞赏。

谢谢

解决方法

您可以使用 while 循环,当新的用户输入出现时,该函数将继续计数。一旦有新的用户输入,该功能就会停止。

,

我找到了解决问题的方法;我不确定这有多有效,但这里是:

我使用 Event() 对象作为标志来运行“重启序列”代码:

from threading import Event
restartFlag = Event()

if restartFlag.set():
    restartSequence()

至于倒数计时器我放弃使用Queue(),转而使用Timer(),它会在设置的时间用完时执行一个函数。 timeFlag 将在时间达到 0 时运行,就像以前的队列一样重新启动我的序列。我意识到在开始一个新序列时它仍然在同一个计时器上运行,所以我创建了 newTimer() 来帮助我在每次启动序列时创建一个新的计时器。这可能不是最好的选择,因为我基本上为此创建了多个线程,但它们应该在完成后死亡,所以 AFAIK 应该没有任何问题。

#Set resetFlag event in order to start Reset Sequence code
    def timeFlag():
        print("Reset Flag Set.")
        resetFlag.set()

    #Create new Timer() Object to avoid using the same every time
    def newTimer():
        print("Created new Reset Timer.")
        global resetTimer
        resetTimer = Timer(60.0,timeFlag)
    newTimer()


所以我在序列开始时执行 resetTimer.start(),并在序列应该结束时立即使用 resetTimer.cancel()newTimer()

现在我们有一个完整的步骤序列

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?