我试图用一个单独运行的定时器来制作一个程序循环,在每次迭代时,代码都会在计时器倒计时的地方继续运行。

我画了这个伪码。这是我正在努力实现的主要想法(请密切关注)。基本上,当计时器运行时,我希望下一个迭代跳转到定时器当前的位置。
我试着写了一段代码,当然是错误的
import time
import threading
def scan_if_won():
#returns True or False
def wait_for_start_signal():
#returns True or False
def main():
print("Action 0")
while True:
time.sleep(20) #or any other timer function
while wait_for_start_signal() == False: #usually takes 6-9 seconds, we never know exact time
start = wait_for_start_signal()
if start == True:
break
#reset timer, countdown from 20
time.sleep(3)
result = scan_if_won() #this scan is not instant, can take from 1 to 2 seconds
if result == False
print("Action 1")
if result == True
print("Action 2")
#Now somehow, at next iteration, time.sleep() value should be the 20 - 3 - scan_if_won() time
main()正在考虑实现线程,但我不知道如何从内部循环启动线程,如果需要的话,在循环中在线程之间共享变量(计时器当前值)。请再看一遍我的伪代码,以充分理解我的问题。谢谢
编辑:
下面是代码的输出:
https://dpaste.org/6NpHu为什么输赢同时发生两次?看上去应该停下来
发布于 2022-07-28 02:49:38
我认为下面的代码解决了如果没有bug的问题。事件()类对于这类问题是非常有用的。我修改了你的代码。
import time
import threading
def scan_if_won():
time.sleep(2)
return False
def wait_for_start_signal():
time.sleep(7)
return True
def check_start_signal(time):
event2.wait(timeout=time)
event2.clear()
while 1:
start=wait_for_start_signal()
if start:
event.set()
return
def main():
print("Action 0")
while True:
try:
t # is thread (t) created ?
event.wait()
event.clear()
except UnboundLocalError:
check_start_signal(20)
t=threading.Thread(target=check_start_signal,args=(20,))
t.start()
time.sleep(3)
result = scan_if_won() #this scan is not instant, can take from 1 to 2 seconds
if result == False:
print("Action 1")
if result == True:
print("Action 2")
#Now somehow, at next iteration, time.sleep() value should be the 20 - 3 - scan_if_won() time
event=threading.Event()
event2=threading.Event()
main()编辑:
在上面的代码中,check_start_signal()将由主线程调用,event.set()也将在调用event.wait()之前被调用。check_start_signal()完成后,将创建新线程,在第二次迭代中,event.wait()将在try块中签入,但event.wait()不会阻塞主线程,因为我们将event.set()在第一个check_start_signal() func中将事件对象的内部标志设置为True。这就是为什么你有更多的线程和你的代码混乱。
我修改了check_start_signal()函数如下:
def check_start_signal(time):
event2.wait(time)
event2.clear
print("passed 20 sec")
while 1:
start=wait_for_start_signal()
print(start)
if start:
if threading.current_thread().__class__.__name__ != '_MainThread':
event1.set()
return注意:在评论中,我说“我测量了”Action1“消息周期,即20秒”--实际上,在我的第一个答案中是正确的,您可以在修订中查看我的第一个答案,它包含了why循环的"time.sleep( 20 -passed)“函数结束,这就是我测量20秒的原因。我的第一个回答不是很好,上面提到过一些错误。
https://stackoverflow.com/questions/73145698
复制相似问题