Как запланировать действие на различные периоды времени из списка в Python

Я пытаюсь запланировать действие (звуковой сигнал) в Vizard, используя Python. Тем не менее, я хочу, чтобы сигнал прозвучал в определенные моменты времени с момента начала судебного разбирательства.

То, что я имею до сих пор, дает мне (например, после его запуска один раз) список времен: [ 1.89229142 5.2610474 9.86058804 11.43137033 13.87078666] и воспроизводит звук с, как представляется, изменяющимися интервалами, и распечатывает элементы вышеупомянутого список времени Просто на самом деле эти элементы не используются в качестве секунд / таймингов для игры.

Мой вопрос: как я могу заставить Python знать, что это не просто числа, а время с момента запуска функции / пробной версии? Вероятно, я должен где-то использовать time.time(), но я просто не уверен в логике того, как туда добраться.

import time
import numpy as np
import viztask                                              


### Start Vizard ### 
viz.go()


### Cue sound ###
cue = viz.addAudio('cues\dong.wav') 
cueDuration = cue.getDuration() 

### Timings ###

def uniform_min_range(a, b, n, min_dist):
    while True:
        times = np.random.uniform(a, b, size=n)
        np.sort(times)
        if np.all(np.diff(times) >= min_dist):
            return times

def timings():
    global times
    times = uniform_min_range(0, 20, 5, 1.0)
    print "times: ", times


def main():
    global times
    timesIndex =0
    for x in range(len(times)):
        cuetime = times[timesIndex]
        cue.play()
        print 'cue'
        print cuetime
        yield viztask.waitTime(cueDuration + cuetime)
        cue.stop()
        timesIndex = timesIndex + 1



timings()
viztask.schedule(main())

РЕДАКТИРОВАТЬ на основе предложения Джакантебери в комментарии к его ответу: Это закрытый рабочий код. Я предполагаю, что несоответствие во времени связано с частотой кадров, как предлагает Джакантербери.

import time
import viztask

viz.go()

times= [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369] #at these times since onset of script, a text "hello world" should be printed
time_intervals=[]
prev=0 

for val in times: 
    time_intervals.append( val - prev ) 
    prev = val 
    print time_intervals

intervalsIndex = 1

start = time.time()

def main():
    global intervalsIndex
    yield viztask.waitTime(time_intervals[0])
    for x in range (len(time_intervals)):
        print ('hello world', '- now: ', time.time()- start)
        yield viztask.waitTime(time_intervals[intervalsIndex])
        intervalsIndex = intervalsIndex + 1

 viztask.schedule(main())

Это теперь дает мне ('привет мир', '- сейчас: ', 1.7820000648498535) ('привет мир', '- сейчас: ', 3.133000135421753) ('привет мир', '- сейчас: ', 4.5350000858306885) ('привет мир ', '- now: ', 11.040000200271606) ('hello world', '- now: ', 18.897000074386597), что очень близко к элементам моего списка (то есть времени и тому, что я изначально хотел).

2 ответа

Решение

busfault верен в том, что вы используете цикл FOR.

Чтобы проверить это с помощью yield, вам нужно schedule вызываемая функция. например

import viz
import viztask

def myfunc():

    for cuetime in (2,3,4):

        mydata = yield viztask.waitTime( cuetime)
        print( 'Wait time: ' , cuetime, ' - Elapsed time: ', mydata.elapsed )

viz.go()
viztask.schedule( myfunc )

который производит вывод, как это...

('Wait time: ', 2, ' - Elapsed time: ', 2.002306576051085)
('Wait time: ', 3, ' - Elapsed time: ', 3.016386045747815)
('Wait time: ', 4, ' - Elapsed time: ', 4.016321305293874)

Вы обнаружите, что несоответствие синхронизации обычно связано с вашей частотой кадров ( 60 Гц ~ 16,7 мс)

После редактирования с помощью OP: ... простой способ проверить, не связаны ли временные различия с синхронизацией кадров, - отключить вертикальную синхронизацию (V-Sync) для вашей видеокарты и запустить ее снова - я подозреваю, вы получите много лучше время, однако вы можете получить разрыв кадра на вашем дисплее - тогда это ваш призыв к тому, что для вас важнее, качество изображения или точность синхронизации. Еще один способ доказать, что это просто обновить, - это просто изменить частоту обновления и посмотреть, изменятся ли временные различия соответственно.

Я заметил, что вы вернулись к использованию time.time() - это будет МЕНЬШЕ точнее, чем использование объекта возврата из waitTime согласно моей демонстрации (т.е. mydata = yield viztask.waitTime( cuetime)...)

Я думаю, что ваша проблема здесь: с for Цикл вам не нужно повторять, он делает это автоматически. Что это будет делать, это перебирать ваш список times каждый раз настройка cuetime к конкретной стоимости

Тоже не то cue.stop() я не буду называть до тех пор, пока не сделаем все уступки, я думаю? Вы можете проверить это с помощью распечатки после yield поскольку я не так знаком с yield

def main():
    global times
    for cuetime in times:
        cue.play()
        print 'cue'
        print cuetime
        yield viztask.waitTime(cueDuration + cuetime)
        cue.stop()
Другие вопросы по тегам