我上个月刚发现python,我根本不是程序员。我正在尝试为电子乐器创建自己的软件。 我实际上需要创建一个触发器,每个0.04 ms调用一个函数 (如果可能的话)。我试过这个:
在我的第一个文件Metronome.py中:
class Metronome:
def __init__(self, clip, _matrix):
self.clip = clip
self._matrix = _matrix
self.inc = -1
def _trigger(self):
self.inc = self.inc + 1
self._matrix.get_button(self.inc, 1).send_value(GREEN_FULL)
t = threading.Timer(1.0, self._trigger).start()
在第二个文件和一个新类中:
我用以下内容导入上一个函数:
from Metronome.py import Metronome
我用以下函数调用上一个函数:
Metronome(self.clip, self._matrix)._trigger()
在_trigger
功能中,self._matrix.get_button(self.inc, 1).send_value(GREEN_FULL)
允许我在乐器界面上发送带领反馈。
当我启动该程序时,我实际上得到了关于我的仪器的第一个led反馈。但是,其他人需要超过1秒的时间进行设置,其中一些同时出现。此外,在每次反馈之后,下一次反馈的时间增加(如5/10 seconde)。我不明白!
答案 0 :(得分:0)
除了关于如何调用_trigger
类的其他问题(参见上面的评论)之外,我认为def _trigger(self):
while True:
self.inc += 1
self._matrix.get_button(self.inc, 1).send_value(GREEN_FULL)
if (whatever_exit_condition):
break
time.sleep(time_interval_in_seconds)
方法应该更像:
if
如果没有退出条件,只需删除t = threading.Timer(1.0, Metronome(self.clip, self._matrix)._trigger).start()
块。
简而言之:避免在每个周期创建一个新的计时器。 相反,当您开始调用方法时,只创建一个Timer:
#! /usr/bin/env python
from sys import argv
import time
import threading
def f():
retry = 0
while True:
print "f, retry=", retry
retry += 1
if retry > 3:
break
time.sleep(2)
print ("f exited")
if __name__ == "__main__":
if len(argv) <= 1:
print "usage: %s num" % (argv[0],)
exit(1)
t = threading.Timer(1.0, f)
t.start()
for i in range(int(argv[1])):
time.sleep(1)
print "main, i=", i
以下是有关如何使用计时器的工作示例:
python timer.py 10
如果你用:
运行它f, retry= 0
main, i= 0
main, i= 1
f, retry= 1
main, i= 2
main, i= 3
f, retry= 2
main, i= 4
main, i= 5
f, retry= 3
f exited
main, i= 6
main, i= 7
main, i= 8
main, i= 9
输出:
{{1}}
基本上主线程是活着的并完成他的事情,而计时器线程是通过计时器创建的,并且它会继续执行它的位(例如,在您的情况下向用户发出信号),有限次数(3 ),在每个周期之间睡觉。 我希望现在更清楚了。