我想安排一系列事件,使得到最近的5ms,事件N的开始时间是t0 + dt * N,其中t0是过程开始后的某个任意时间。如果事件输出到终端,它们将定期发生而没有暂停或加速。如果它们是噪音,它会产生规律的节奏。这是我的第一次尝试。
#include <stdio.h>
#include <time.h>
#include <math.h>
void fsleep(double t)
{
time_t sec = floor(t);
long nsec = 1e9*(t - sec);
struct timespec s;
s.tv_sec = sec;
s.tv_nsec = nsec;
nanosleep(&s, NULL);
}
int main(int argc, const char **argv)
{
for (unsigned i = 0;; i++) {
printf("%d\n", i);
fflush(stdout);
fsleep(0.334);
}
}
即使是实时优先级(nice -n -20
)也是总垃圾。一直有明显的紧张情绪,暂停时间最长为1秒,之后连续打印一大堆数字。为了测试它是否是我的终端,我制作了以下脚本:
from time import sleep
from sys import stdin
def raw_stdin():
"""Switches stdin to a non-buffering, non-echoing mode,
handing keystrokes directly to the program as soon as they're
received and printing nothing to the terminal."""
import termios as t
f = t.tcgetattr(stdin)
f[3] &= ~(t.ICANON|t.ECHO)
t.tcsetattr(stdin, t.TCSANOW, f)
raw_stdin()
for i in range(10000000):
#sleep(.334)
stdin.read(1)
print(i)
如果我经常敲击任何一个按键,即每次按下相同的时间间隔到最近的10ms左右,我会得到常规输出,没有犹豫。这证明了终端的响应速度不够快,而且我尝试做的事情是可能的。我很难想象电脑无法用我的左手食指做些什么。
我认为这可能与我的Linux内核有关。我有兴趣知道如果在Windows或其他Linux内核中运行会发生什么。
答案 0 :(得分:0)
我明白了。这是我的终端(xfce4-terminal)。它中有一个错误会弄乱实时输出。有关详情,请参阅https://stackoverflow.com/a/47744798/1840698。