如何使用threading.Timer创建触发器?

时间:2015-06-14 04:00:08

标签: python multithreading python-2.7 timer

我上个月刚发现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)。我不明白!

1 个答案:

答案 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 ),在每个周期之间睡觉。 我希望现在更清楚了。