【问题标题】:Python check time interval (perform actions in 1, 2, 3, 10 milliseconds)Python 检查时间间隔(在 1、2、3、10 毫秒内执行操作)
【发布时间】:2015-04-21 23:42:04
【问题描述】:

我希望检查事件何时发生,做出一组相隔一定时间的动作。

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 只能精确到 10 毫秒。我应该考虑在不同的操作系统上运行还是同时使用不同的语言?

【问题讨论】:

  • 它们是按顺序排列的吗?
  • 事件应按顺序进行
  • 所以 1,2,3 相隔 10 毫秒?
  • 没错。该序列是两个电压检测峰值之间的比率。
  • 你从哪里得到 t?此代码不会运行。

标签: python time intervals


【解决方案1】:

如果您真的需要准确的计时,我强烈建议您使用没有垃圾收集的语言,如 C 或 C++。但是,如果您可以容忍与精确栅格的一些偏差,则可以使用 Python。

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

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

啊,我建议只获取一次 time() 并与一些容忍度进行比较。否则你最终会失去时间段。一个好的技术是计算下一个时隙的时间并比较 time()

编辑: 您需要为每个间隔单独维护下一个时隙。此外,为避免长期偏差,请使用绝对时间,而不是增量:

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
    ....

【讨论】:

  • 你为什么要这样做?只需获取一次当前周期的时间,然后对每个插槽进行测试。但是,这种“繁忙的轮询”是不好的做法。您真的应该尝试找到更好的解决方案。也许 sleep() 甚至会有所帮助,但到目前为止我还没有使用过。如果我有一些常规内容要输入到 PC,我会使用一个外部微控制器来处理实时内容。
  • 睡眠会阻塞,所以这不是一个选项
  • 这取决于程序的其余部分。如果它的唯一目的是每隔几毫秒检查一次,睡眠就可以了,如果它可以等待那么短的时间。只需使用所有时隙的 GCD。 (例如,这将是 1 毫秒)。
  • 我将在此处提供有关我的伪 sn-p 的更多上下文。它是脉搏检测设备的一部分,当您出现脉搏时,电压会瞬间升高。在我收到电压后(我检查它是否超过了 3v 的阈值),我想在脉冲后的特定时间在设备中的其他寄存器上设置一系列电压(做某事)。
【解决方案2】:

您说您正在流式传输到图表。如果您每秒更新图表 5-10 次左右,那么对于人类观察者来说,它看起来几乎是连续的。所以我会考虑这种可能性:您的图形环境可能有某种计时器滴答声,或者如果没有,您可能会查看标准库 threading.Timer。当数据点到达时,您立即将其添加到数据缓冲区。但是您仅在计时器触发时才更新图表。您永远不必担心丢失任何数据。我一直在做这种事情,并且在实践中效果很好。

【讨论】:

  • 那么,放慢我的图表更新频率/准确度,并把我的资源用于收集正确的数据,并将其放入缓冲区以供我的图表更新?
  • 我认为 Graph 处理不会有这样的问题。当然,除非你等待 vsync。
  • 是的,您降低了更新频率,但在任何意义上都不会降低其准确性,该图表是准确,因为您没有丢弃数据。无论如何,人类无法看到图形每秒变化 100 次,大概人类观众就是你这样做的原因。当您看电视时,屏幕不会每秒更新 100 次,但您不会抱怨它“不准确”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多