如何一致地重播事件列表
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
句点。这是真正做到这一点的唯一方法。以上是关于如何一致地重播事件列表的主要内容,如果未能解决你的问题,请参考以下文章