2016-11-08 5 views
-4

私はminecraft pi editionのためにpythonでデジタル時計を作っています。私は、多くのコードを含む単一のwhileループを使用しています - 実行するのに短い時間がかかりますが、それは数ミリ秒も私が望む以上に多く、これは私の時計に混乱を引き起こしています。 whileループを完全に正確にする方法はありますか?私はtime.sleep(1)という2つのカウントを使用していますが、実行には2秒以上かかります。whileループを一定の時間がかかるようにする方法

例:

while True: 
    start = time.time() 
    for _ in range(5): 
     1000**3 
    time.sleep(1) 
    print (time.time() - start) 

ループ当たり1秒以上かかります。

1.00102806091 
1.00028204918 
1.00103116035 
1.00051879883 
1.0010240078 
1.00102782249 

このエラーは時間の経過と共に累積します。どのように私はそれが漂流するのを防ぐことができますか?

+1

あなたのループの各反復は2秒( 'time.sleep()'によって)+あなたのコードが実行されるwhile時間の所要時間になります。 'time.sleep(n)'はあなたのコードの実行を 'n'秒遅らせます –

+0

どうしてそんなに多くの否定的なフィードバックがありますか?私は間違って何をしていますか? –

+1

よく@ I.Scott私が見ることはあなたの質問にコードを入れていないということです。質問には常にコードが必要ですか?いいえ、全くありません。しかし、あなたのケースでは、あなたの質問からコードを除外することは、誰かがあなたのためにコードを書いてほしいというメッセージを送るかもしれません。いくつかのコードをお持ちの場合は、あなたの問題に少なくともあなたの問題を解決しようとしていることを示すために追加することをお勧めします。 –

答えて

6

あなたは時刻同期コード(このサンプルでは、​​私が持っているサーバモニタから撮影)書くことができます:あなたが何かに2秒ごとに実行したい場合は

# sync time so that it runs every two minutes, in 20 minute cycles (:00, :20, :40) 
    time.sleep(1200 - (time.time() % 1200)) 
    while True: 
     # Do stuff 
     time.sleep(120 - (time.time() % 120)) 

を:

time.sleep(2 - (time.time() % 2)) 

を、それは眠るようになります次の偶数秒まで、次に実行してください。 Do stuffまでの時間が1サイクルを超えない限り、これは機能します。その後、ビートをスキップします。クロック、出力例については

:例えば0.37

>>> for _ in range(5): 
...  time.sleep(1 - (time.time() % 1)) 
...  print time.time() 
1478641441.0 
1478641442.0 
1478641443.0 
1478641444.0 
1478641445.0 

time.time() % 1は、現在の時刻から2番目のほんの一部を与えるので、これは動作します。私がtime.sleep(1 - 0.37)と言うとき、それは0.63秒で眠ります。これは、次のラウンド秒まで残っている時間です。

次回にコードを実行するのに0.55秒かかる場合は、残りの0.45が自動的にスリープします。

+0

「time.sleep(1 - (time.time()%1))」がどのように機能するか説明できますか?私はそれを理解していない、本当に –

+0

@ I.Scott私は簡単な説明を含めるように私の答えを更新しました。 – TemporalWolf

関連する問題