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))
所以这是我到目前为止所获得的代码。如果它运行,这就是它的输出。
END
The sensor changed states 320 times
10.504526853561401
所以我试图设置的是名为get_time()的函数,它将找到从调用变量last_time到调用实际函数的时间差。这样做的目的是考虑更改sensor_state并添加到sleep函数中的计数器变量所需的时间。
你可以自己做数学,但是当它循环通过320次时,程序运行的所有时间都会延迟10秒。我希望程序以尽可能接近10秒的时间结束,这就是为什么我试图通过减去更改传感器状态并添加到计数器所花费的时间来考虑get_time()函数的额外时间。
我向你们提出的问题是,你知道有哪些方法可以帮助我降低这个时间漂移吗?我的技术是否能解决失去的时间甚至是有效的方法?我想在某些时候将变量作为参数添加到time.sleep中,并且可能将睡眠降低到甚至更小的值(1.0 / 72)秒。可以选择多线程吗?任何意见都将不胜感激。
答案 0 :(得分:0)
我在代码中给出的答案非常广泛。让我们看看我是否可以让你走上正轨。你可能不想使用sleep,因为它会阻塞,一切都变成串行。这很重要,因为你声明要尽可能接近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()