import time
def get_time():
global time_elapsed
time_elapsed = 0
time_elapsed = time.time() - last_time
return time_elapsed
def gear_encoder():
global gear_counter, run_counter,encoder_running, sensor_state,last_time
gear_counter = 0
run_counter = 0
encoder_running = False
sensor_state = False
encoder_running = True
while encoder_running:
last_time = time.time()
if run_counter >= 320:
print("END")
break
if sensor_state == True and gear_counter <= 5:
sensor_state = not sensor_state
gear_counter += 1
run_counter += 1
#print("State is " + str(sensor_state))
time.sleep((1.0/24) - get_time())
elif sensor_state == False and gear_counter <= 5:
sensor_state = not sensor_state
gear_counter += 1
run_counter += 1
#print("State is " + str(sensor_state))
time.sleep((1.0/24) - get_time())
elif sensor_state == True and gear_counter <= 8:
sensor_state = not sensor_state
gear_counter += 1
run_counter +=1
#print("State is " + str(sensor_state))
time.sleep((1.0/72) - get_time())
elif sensor_state == False and gear_counter <= 8:
sensor_state = not sensor_state
gear_counter += 1
run_counter +=1
#print("State is " + str(sensor_state))
time.sleep((1.0/72) - get_time())
else:
gear_counter = 0
start_time = time.time()
gear_encoder()
end_time = time.time() - start_time
print("The sensor changed states " + str(run_counter) + " times")
print(str(end_time))
これはこれまでのコードです。これを実行すると、出力されます。time.sleepを使用しているときにwhileループで失われた時間をどのように考慮することができますか
END
The sensor changed states 320 times
10.504526853561401
それでは、私が設定しようとすると、変数last_timeは、実際の関数が呼び出されたときに呼び出されたときからの時間に差がありますGET_TIMEと呼ばれる関数()でした。これの目的は、sensor_stateを変更し、スリープ機能のカウンタ変数に追加するのに要する時間を考慮に入れることでした。
あなたは数学を自分で行うことができますが、このプログラムが実行されているすべてのtime.sleepsが320回繰り返されると、最大10秒が加算されます。プログラムをできるだけ10秒近く終了させてください。なぜなら、センサーの状態を変更してカウンターに追加するのにかかる時間を減算することによって、get_time()関数で余分な時間を考慮しようとしたからです。
私の質問はすべてですが、この時間のドリフトを低くするのに役立つ方法を知っていますか?私のテクニックは、有効なアプローチでさえ、失われた時間を説明するものでしたか?ある時点で、変数をtime.sleepに引数として追加し、おそらくは(1.0/72)秒よりも小さな値にスリープを低下させたいと思います。ここでマルチスレッドがオプションになるかもしれませんか?どんな入力も感謝します。
本質的に、time.sleep()で一時的にプログラムを停止することなく、特定のビットを実行するときにスケジューラのハンドルを持つことができますか?もしそうなら、私はこれを自分のプログラムに実装しようとします。 –
あなたの声明は正しいです。トリガされた機能が完了するまでには時間がかかりますが、しかし、**あなたがスケジュールするたびにプログラムが終了することを保証する**ことができます。 –
私はスケジューリングに取り組んでいるプログラムを得て、それは望ましくない遅れのほとんどすべてを取り除いた。私がプログラムでやったやり方は、私が望むだけのスケジュールされたイベントを作るループを作りました。そのループが終了した後、私はそれらを実行しました。私は10秒に達するために320のスケジュールを作った。プログラムを一度に数分間実行したいのであれば、私が作成する必要のあるスケジュールの量は問題になるでしょうか? –