一旦使用Raspberry Pi检测到运动,我正在开发一个带有默认音频播放的运动检测器。
然而,当检测到连续动作时,下一个音频将开始播放并在前一个音频尚未结束时开始重叠。
我可以在python中实现任何循环吗?
目前,我正在使用带有音频总长度的定时器循环,然后再播放另一个音频。但我相信有更好的解决方案。有什么想法吗?
#!/usr/bin/python
import sched, time
s = sched.scheduler(time.time, time.sleep)
def do_something(sc):
print "Doing stuff..."
# do your stuff
sc.enter(10, 1, do_something, (sc,))
s.enter(10, 1, do_something, (s,))
s.run()
答案 0 :(得分:0)
这只是一个想法,但更容易写作答案而不是评论。解决方法可能是设置一个状态,每次运行该函数时它都高1。如果它超过1,请等到函数结束,然后再次运行该函数,否则只需正常运行该函数。
如果它不起作用我将删除答案,但我认为它可能会做(虽然可能会进行一些调整)。
import sched, time
s = sched.scheduler(time.time, time.sleep)
state = 0
def do_something(sc):
global state
#increase the state, and cancel if it's over 1 (already running)
state += 1
if state > 1:
return
original_state = state
print "Doing stuff..."
# do your stuff
sc.enter(10, 1, do_something, (sc,))
#Run again if the state has changed during the function
if original_state != state:
s.run()
state -= 1
state -= 1
编辑:制作我自己的功能似乎有效。它在后台执行,并使用状态构思将它们排队。 time.sleep(0.01)
部分只是因为结尾似乎与下一个的开头重叠。使用args
和kwargs
,即使它是空的,它也会传递它们,所以你必须在你的函数中允许它们。
主要部分:
import time
from threading import Thread
class ThreadHelper(Thread):
def __init__(self, function, *args, **kwargs):
self.args = args
self.kwargs = kwargs
Thread.__init__(self)
self.function = function
def run(self):
self.function(*self.args, **self.kwargs)
def run_once(func, *args, **kwargs):
global state
state[0] += 1
original_state = state[0]
if state[0] > 1:
return
func(*args, **kwargs)
time.sleep(0.01)
while state[0] != original_state:
state[0] -= 1
func(*args, **kwargs)
time.sleep(0.01)
state[0] -= 1
你如何使用它:
def dosomething(*args, **kwargs):
print 'start'
time.sleep(0.5)
print 'end'
state = [0]
ThreadHelper(run_once, dosomething, _state=state).start()
ThreadHelper(run_once, dosomething, _state=state).start()
ThreadHelper(run_once, dosomething, _state=state).start()