我有一个 while True 循环,它将变量发送到外部函数,然后使用返回的值。该发送/接收过程具有用户可配置的频率,该频率是从外部 .ini 配置文件中保存和读取的。
我尝试过 time.sleep(1 /Frequency),但考虑到其他地方使用的线程数,我对准确性不满意。例如。 60Hz 的频率(周期为 0.0166667)给出的“实际”time.sleep() 周期约为 0.0311。
我的偏好是使用一个额外的 while 循环,它将当前时间与开始时间加上周期进行比较,如下所示:
EndTime = time.time() + (1 / Frequency)
while time.time() - EndTime < 0:
sleep(0)
这将适合我的 while True 函数的末尾,如下所示:
while True:
A = random.randint(0, 5)
B = random.randint(0, 10)
C = random.randint(0, 20)
Values = ExternalFunction.main(Variable_A = A, Variable_B = B, Variable_C = C)
Return_A = Values['A_Out']
Return_B = Values['B_Out']
Return_C = Values['C_Out']
#Updated other functions with Return_A, Return_B and Return_C
EndTime = time.time() + (1 / Frequency)
while time.time() - EndTime < 0:
time.sleep(0)
我遗漏了一些东西,因为添加 while 循环导致该函数仅执行一次。如何才能使上述功能正常运行?这是在非实时操作系统上“精确”频率控制的最佳方法吗?我应该为这个特定组件使用线程吗?我正在 Windows 7(64 位)和 Ubuntu(64 位)上测试此功能。