首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使程序单独运行定时器和代码,但与之交互?

如何使程序单独运行定时器和代码,但与之交互?
EN

Stack Overflow用户
提问于 2022-07-27 23:36:25
回答 1查看 176关注 0票数 -2

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

我画了这个伪码。这是我正在努力实现的主要想法(请密切关注)。基本上,当计时器运行时,我希望下一个迭代跳转到定时器当前的位置。

我试着写了一段代码,当然是错误的

代码语言:javascript
复制
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为什么输赢同时发生两次?看上去应该停下来

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-28 02:49:38

我认为下面的代码解决了如果没有bug的问题。事件()类对于这类问题是非常有用的。我修改了你的代码。

代码语言:javascript
复制
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()函数如下:

代码语言:javascript
复制
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秒的原因。我的第一个回答不是很好,上面提到过一些错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73145698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档