如何一致地重播事件列表

Posted

技术标签:

【中文标题】如何一致地重播事件列表【英文标题】:How to replay a list of event consistently 【发布时间】:2012-12-03 17:14:16 【问题描述】:

我有一个文件,其中包含间隔一段时间的事件列表。这是一个例子:

0, Hello World
0.5, Say Hi
2, Say Bye

我希望能够重播这一系列事件。第一列是两个连续事件之间的增量(第一列立即开始,第二列在 0.5 秒后发生,第三列在 2 秒后发生,...)

我如何在 Windows 上做到这一点。有什么可以确保我的时间非常准确吗?我们的想法是尽可能接近听音乐时的情况,您不希望音频事件发生在正确的时间,而是准时发生。

【问题讨论】:

【参考方案1】:

这可以通过使用time 模块中的sleep 函数轻松完成。确切的代码应该是这样的:

import time

# Change data.txt to the name of your file
data_file = open("data.txt", "r")

# Get rid of blank lines (often the last line of the file)
vals = [i for i in data_file.read().split('\n') if i]

data_file.close()

for i in vals:
    i = i.split(',')
    i[1] = i[1][1:]
    time.sleep(float(i[0]))

    print i[1]

这是一个不完美的算法,但它应该让您了解如何做到这一点。我们读取文件,将其拆分为换行符分隔列表,然后遍历每个以逗号分隔的对联休眠指定的秒数,并打印指定的字符串。

【讨论】:

是的,我已经遇到过这个解决方案,但想知道我们是否可以得到更准确的结果。 Timer api(据我所知)不够准确,无法正确模拟。我的简单示例没有显示幕后的真实应用程序,但我确实需要 Windows 上可用的最佳精度(这就是为什么我想直接调用 Win32 C api 的原因) 我怀疑可能是这种情况。由于打印语句占用时间(拆分字符串也是如此),因此该算法将不准确,因为所需时间总是略大于文件中指定的时间。一个简单的解决方案来自爱好者游戏编程。他们的解决方案是记录循环开始时和循环结束时(在我们睡觉之前)的时间,得到开始时间和结束时间之间的差异,然后从我们睡眠的时间中减去它。这会给你一个更准确(虽然技术上仍然不完美)的延迟。【参考方案2】:

您正在 Python 中寻找time.sleep(...)

如果您将该文件作为列表加载,然后打印值,

import time

with open("datafile.txt", "r") as infile:
   lines = infile.read().split('\n')

   for line in lines:
      wait, response = line.split(',')
      time.sleep(float(wait))
      print response

【讨论】:

查看我对 Maxwell 答案的评论。您的解决方案工作正常,但不确定我的问题的准确性部分。 在这种情况下,你最好的选择可能是函数式编程——将这些函数作为你正在做的任何事情的一部分调用,这样你就可以保证完美的时序——函数只会被调用当调用函数结束时,确保您不必手动排列time.sleep 句点。这是真正做到这一点的唯一方法。

以上是关于如何一致地重播事件列表的主要内容,如果未能解决你的问题,请参考以下文章

admob间隙回调事件只能工作一次,而不是第二次。

如何从另一个类调用 VRInput 类事件(OnClick、OnDoubleClick、...)?

Apache Kafka:重播主题中的消息

SharePoint 全天事件不一致

同步关注点的事件溯源

discord.js 如何从 fetchMessage 事件中获取“反应用户”列表?