如何解决有什么办法可以在完成我的输入序列后摆脱我的超时倒计时线程? 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 举报,一经查实,本站将立刻删除。