首页 / PYTHON / 如何在python中定期运行函数
如何在python中定期运行函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在python中定期运行函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2604字,纯文字阅读大概需要4分钟。
内容图文
![如何在python中定期运行函数](/upload/InfoBanner/zyjiaocheng/715/42bd69bcaa01476dacf5e42d5947fc1d.jpg)
我有一个简单的节拍器运行,并且出于某种原因,当它处于较低的bpm时它很好,但是在较高的bpms它是不一致的并且不稳定.
我不知道发生了什么事.
我想尝试使用某些东西定期运行它.有没有办法做到这一点?
这是我的代码:
class thalam():
def __init__(self,root,e):
self.lag=0.2
self.root=root
self.count=0
self.thread=threading.Thread(target=self.play)
self.thread.daemon=True
self.tempo=60.0/120
self.e=e
self.pause=False
self.tick=open("tick.wav","rb").read()
self.count=0
self.next_call = time.time()
def play(self):
if self.pause:
return
winsound.PlaySound(self.tick,winsound.SND_MEMORY)
self.count+=1
if self.count==990:
self.thread=threading.Thread(target=self.play)
self.thread.daemon=True
self.thread.start()
return
self.next_call+=self.tempo
new=threading.Timer(self.next_call-time.time(),self.play)
new.daemon=True
new.start()
def stop(self):
self.pause=True
winsound.PlaySound(None,winsound.SND_ASYNC)
def start(self):
self.pause=False
def settempo(self,a):
self.tempo=a
class Metronome(Frame):
def __init__(self,root):
Frame.__init__(self,root)
self.first=True
self.root=root
self.e=Entry(self)
self.e.grid(row=0,column=1)
self.e.insert(0,"120")
self.play=Button(self,text="Play",command=self.tick)
self.play.grid(row=1,column=1)
self.l=Button(self,text="<",command=lambda:self.inc("l"))
self.l.grid(row=0,column=0)
self.r=Button(self,text=">",command=lambda:self.inc("r"))
self.r.grid(row=0,column=2)
def tick(self):
self.beat=thalam(root,self.e)
self.beat.thread.start()
self.play.configure(text="Stop",command=self.notick)
def notick(self):
self.play.configure(text="Start",command=self.tick)
self.beat.stop()
def inc(self,a):
if a=="l":
try:
new=str(int(self.e.get())-5)
self.e.delete(0, END)
self.e.insert(0,new)
self.beat.settempo(60.0/(int(self.e.get())))
except:
print "Invalid BPM"
return
elif a=="r":
try:
new=str(int(self.e.get())+5)
self.e.delete(0, END)
self.e.insert(0,new)
self.beat.settempo((60.0/(int(self.e.get()))))
except:
print "Invalid BPM"
return
解决方法:
由于需要处理器与其他程序共享,所以做任何需要时间精度的事情都是非常困难的.不幸的是,对于计时关键程序,操作系统可以随时切换到另一个进程.这可能意味着在明显延迟之后它可能不会返回您的程序.在导入时间之后使用time.sleep是尝试平衡蜂鸣声之间的时间的更一致的方式,因为处理器没有更少的“理由”切换.虽然Windows上的睡眠默认粒度为15.6ms,但我认为你不需要超过64Hz的节拍.此外,您似乎正在使用多线程来尝试解决您的问题,但是,线程的python实现有时会强制线程按顺序运行.这使得切换到您的过程更加重要.
我觉得最好的解决方案是生成包含所需频率的节拍器蜂鸣声的声音数据.然后你可以用操作系统理解的方式播放声音数据.由于系统知道如何以可靠的方式处理声音,因此您的节拍器将起作用.
很抱歉让人失望但是时间紧迫的应用程序非常困难,除非你想弄清楚你正在使用的系统.
内容总结
以上是互联网集市为您收集整理的如何在python中定期运行函数全部内容,希望文章能够帮你解决如何在python中定期运行函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。