Python检查时间间隔(在1、2、3、10毫秒内执行操作)

Python检查时间间隔(在1、2、3、10毫秒内执行操作),python,time,intervals,Python,Time,Intervals,我想检查一个事件发生的时间,做一组在某个时间间隔的动作 if (volt>3): oldtime=curtime curtime = t diff = curtime-oldtime if time.time == curtime + (difference/3): do something temptime=curtime+(difference/3) if time.time == curtime+(temptim

我想检查一个事件发生的时间,做一组在某个时间间隔的动作

if (volt>3):
    oldtime=curtime
    curtime = t
    diff = curtime-oldtime
    if time.time == curtime + (difference/3):
        do something
        temptime=curtime+(difference/3)
    if time.time == curtime+(temptime+(difference/10):
        do something
        temptime == (temptime+(difference/10)
    if .... etc
所以,每当我的电压达到一个阈值,我想发送一系列事件,这些事件有非常具体的时间。我很确定现在的设置方式既不高效也不准确。我正在将数据流传输到图形中,不想在等待这些间隔时暂停(并且大约每10毫秒检查一次电压)

我不知道应该用什么来代替if语句,使其充当when time.time=timeWanted:do thing

我还需要为此执行多线程吗?(还没有经历过)


<>从研究中我看到Windows只需用定时器精确到10ms。我应该考虑在不同的OS上运行还是使用不同的语言?

< P>如果你真的需要精确的定时,我强烈建议使用一个没有垃圾收集的语言,比如C或C++。如果你能容忍一些偏离精确光栅的话,你就可以了。不过,Python可以很好地使用

关于time.time的分辨率,请参阅文档中的相应页面。Windows和Linux之间存在差异。其中说明对于后者,time.time()具有更高的分辨率,因为Windows应该是time.clock()。后者我无法确认,因为我没有可用的Windows框

无论如何,最好使用线程/多处理框架,因为轮询时隙时CPU会非常繁忙


啊,我建议只获取一次time(),并与一些容差进行比较。否则最终会丢失时间段。一个好方法是计算下一个时间段的时间并比较time()

你说你是流到一个图表上。如果你把图表更新到大约每秒5-10次,它看起来对人类观察者来说是非常连续的。所以我会考虑这种可能性:你的图形环境大概有某种定时记录器,或者如果没有,你可以看看标准库线程。定时器。当数据点到达时,A立即将其添加到数据缓冲区。但只有在计时器启动时才更新图形。您从不担心丢失任何数据。我一直都在做这种事情,而且在实践中效果很好。

它们是按顺序排列的吗?事件应该按顺序排列,因此相隔1,2,3 10ms?这是正确的。顺序是两个电压峰值之间的比率选项。从何处获取t?此代码将不会运行。为什么要这样做?只需获取当前周期的时间一次,然后对每个插槽进行测试。但是,这种“繁忙轮询”是一种不好的做法。您应该尝试找到更好的解决方案。可能是sleep()甚至会有帮助,但我至今还没有这样做。如果我有一些常规的东西输入到电脑,我会使用一个外部微控制器来处理实时的东西。睡眠会阻塞,所以这不是一个选项,这取决于程序的其余部分。如果它的唯一目的是每隔几毫秒检查一次,那么睡眠就可以了,如果它可以它的周期很小。只需使用所有时隙的GCD(例如1ms)。我将提供更多关于我的伪代码片段的上下文。它是脉冲检测设备的一部分,当脉冲出现时,电压会瞬间增加。在我收到电压后(我检查它是否通过3v的阈值),我想在设备中的其他寄存器上设置一系列电压(执行某些操作)在脉冲后的特定时间。因此,减慢我的图形更新频率/精度,并将我的资源用于收集正确的数据,并将其放入缓冲区,以便我的图形进行更新?我认为图形处理不会出现这样的问题。当然,除非您等待vsync。是的,您会减慢更新频率,但不会降低更新速度准确性在任何意义上,图形都是准确的,因为你没有扔掉数据。不管怎样,人类看不到图形每秒改变100次,大概人类观众就是你这样做的原因。当你看电视时,屏幕每秒更新100次,但你不会抱怨它“不准确”
curr_time = time.time()

if curr_time >= interval1_next_time:
    interval1_next_time += INTERVAL1_TSLOT
    if curr_time >= interval1_next_time:
        # we lost a full timeslot, so slowly adjust (can also report)
        interval1_next_time += INTERVAL1_TSLOT
    ....
if curr_time >= interval2_next_time:
    interval2_next_time += INTERVAL2_TSLOT
    ....