第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在python中定期運(yùn)行函數(shù)

如何在python中定期運(yùn)行函數(shù)

眼眸繁星 2019-12-06 15:50:04
我有一個(gè)簡(jiǎn)單的節(jié)拍器運(yùn)行,由于某種原因,當(dāng)它以較低的bpm時(shí)就可以了,但是以較高的bpms時(shí)則不一致且不穩(wěn)定。我不知道怎么回事。我想嘗試使用一些東西定期運(yùn)行它。有沒(méi)有辦法做到這一點(diǎn)?這是我的代碼: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=aclass 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):    
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

由于需要處理器與其他程序共享自身,因此做任何需要時(shí)間精度的事情都非常困難。不幸的是,對(duì)于定時(shí)關(guān)鍵程序,操作系統(tǒng)可以隨時(shí)選擇切換到另一個(gè)進(jìn)程。這可能意味著它可能要等到明顯的延遲后才能返回程序。導(dǎo)入時(shí)間后使用time.sleep這是一種嘗試平衡嗶嗶聲之間時(shí)間的更一致的方法,因?yàn)樘幚砥鞯摹袄碛伞睖p少了。盡管Windows上的睡眠默認(rèn)粒度為15.6ms,但我認(rèn)為您無(wú)需播放超過(guò)64Hz的拍子??磥?lái)您正在使用多線程來(lái)嘗試解決您的問(wèn)題,但是,線程的python實(shí)現(xiàn)有時(shí)會(huì)強(qiáng)制線程按順序運(yùn)行。這將使您從流程中退出的情況變得更加糟糕。

我認(rèn)為最好的解決方案是以所需的頻率生成包含節(jié)拍器蜂鳴聲的聲音數(shù)據(jù)。然后,您可以以操作系統(tǒng)熟悉的方式播放聲音數(shù)據(jù)。由于系統(tǒng)知道如何以可靠的方式處理聲音,因此您的節(jié)拍器將開(kāi)始工作。

令人失望的是,但是計(jì)時(shí)關(guān)鍵的應(yīng)用程序非常困難,除非您想弄清正在使用的系統(tǒng)。


查看完整回答
反對(duì) 回復(fù) 2019-12-06
?
qq_花開(kāi)花謝_0

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊

播放聲音來(lái)模擬普通的節(jié)拍器不需要“實(shí)時(shí)”功能。


看起來(lái)您使用Tkinter框架創(chuàng)建了GUI。root.after()允許您延遲調(diào)用函數(shù)。您可以使用它來(lái)實(shí)現(xiàn)刻度:


def tick(interval, function, *args):

    root.after(interval - timer() % interval, tick, interval, function, *args)

    function(*args) # assume it doesn't block

tick()運(yùn)行function與給定的args每interval毫秒。單個(gè)刻度的持續(xù)時(shí)間受root.after()精度影響,但從長(zhǎng)遠(yuǎn)來(lái)看,穩(wěn)定性僅取決于timer()功能。


這是一個(gè)打印一些統(tǒng)計(jì)數(shù)據(jù)(240每分鐘心跳數(shù))的腳本:


#!/usr/bin/env python

from __future__ import division, print_function

import sys

from timeit import default_timer

try:

    from Tkinter import Tk

except ImportError: # Python 3

    from tkinter import Tk


def timer():

    return int(default_timer() * 1000 + .5)


def tick(interval, function, *args):

    root.after(interval - timer() % interval, tick, interval, function, *args)

    function(*args) # assume it doesn't block


def bpm(milliseconds):

    """Beats per minute."""

    return 60000 / milliseconds


def print_tempo(last=[timer()], total=[0], count=[0]):

    now = timer()

    elapsed = now - last[0]

    total[0] += elapsed

    count[0] += 1

    average = total[0] / count[0]

    print("{:.1f} BPM, average: {:.0f} BPM, now {}"

          .format(bpm(elapsed), bpm(average), now),

          end='\r', file=sys.stderr)

    last[0] = now


interval = 250 # milliseconds

root = Tk()

root.withdraw() # don't show GUI

root.after(interval - timer() % interval, tick, interval, print_tempo)

root.mainloop()

速度僅拍打一拍:我的機(jī)器上為240±1。


查看完整回答
反對(duì) 回復(fù) 2019-12-06
  • 2 回答
  • 0 關(guān)注
  • 526 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)