2017-07-06 4 views
1
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)秒よりも小さな値にスリープを低下させたいと思います。ここでマルチスレッドがオプションになるかもしれませんか?どんな入力も感謝します。

答えて

0

私がコードで与える答えは非常に広範囲です。私があなたを道につかせることができるかどうかを見てみましょう。あなたはおそらく睡眠を使用したくないでしょう。なぜなら、睡眠をブロックし、すべてが逐次的になるからですできるだけ10秒以内に退室したいと述べたので重要です。ブロッキングコールが発生していない場合は、かなり簡単です。他のタイマーも同様に設定できます。以下にいくつかの例を示します。タイマーを10秒後に終了するように設定します。 11秒間設定されたタイマーは、トリガする前に終了が発生するため発生しません。これは対話的ではなく、スクリプトとして実行する必要があります。

import sched, time, sys 

def myExit(): 
    # Do stuff here 
    sys.exit() 

s = sched.scheduler(time.time, time.sleep) 
# This causes the program to exit... 
s.enter(10, 1, myExit,()) 
s.enter(2.0/5, 2, print_answer, (1,)) 
s.enter(3.0/5, 2, print_answer, (2,)) 
s.enter(11, 2, print_answer, (3,)) 
s.run() 
+0

本質的に、time.sleep()で一時的にプログラムを停止することなく、特定のビットを実行するときにスケジューラのハンドルを持つことができますか?もしそうなら、私はこれを自分のプログラムに実装しようとします。 –

+0

あなたの声明は正しいです。トリガされた機能が完了するまでには時間がかかりますが、しかし、**あなたがスケジュールするたびにプログラムが終了することを保証する**ことができます。 –

+0

私はスケジューリングに取り組んでいるプログラムを得て、それは望ましくない遅れのほとんどすべてを取り除いた。私がプログラムでやったやり方は、私が望むだけのスケジュールされたイベントを作るループを作りました。そのループが終了した後、私はそれらを実行しました。私は10秒に達するために320のスケジュールを作った。プログラムを一度に数分間実行したいのであれば、私が作成する必要のあるスケジュールの量は問題になるでしょうか? –

関連する問題