2017-12-10 15 views
0

イベントNの開始時刻をt0 + dt * Nとすると、最も近い5msまでの一連のイベントをスケジュールしたいと思います。ここで、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) 

私は最寄りの10ミリ秒かそこらまですなわちストローク間の同じ時間間隔で、定期的に任意のキーを押した場合、私は、定期的な出力を得ます躊躇しない。これは、ターミナルが十分な応答以上であることを証明し、私がしようとしていることが可能であることを証明します。コンピュータが私の左手人差し指でできることをすることができないと想像するのは苦労します。

私はLinuxカーネルと関係があると思います。私はこれがWindowsや他のLinuxカーネルで実行されている場合、何が起こるかを知ることに興味があります。

+0

「定期的にキーを押した場合、つまり、ストローク間のミリ秒数が正確に同じ場合は、LOL!あなたは決してそれをしなかった –

+0

私はあなたの嘲笑を必要としません。そして、それはもっと10msのようです。 10msの正確さを備えた通常のビートは、あなたの指ではそれほど難しくありません。 – enigmaticPhysicist

+0

コードは連続番号を出力します。どのように各ライン間の遅延を測定していますか? – Blender

答えて

関連する問題