Возврат нового PyObject * из C ++ в Python со временем

Первая форма, которую вы перечислите, работает, так как она будет оценивать строку в конце delay. Использование eval(), как правило, не является хорошей идеей, поэтому вам следует избегать этого.

Второй метод не работает, поскольку вы немедленно выполняете объект функции с помощью оператора функции () . Что происходит, так это то, что playNote выполняется немедленно, если вы используете форму playNote(...), поэтому в конце задержки ничего не произойдет.

Вместо этого вы должны передать анонимную функцию setTimeout , поэтому правильная форма:

setTimeout(function() { playNote(currentaudio.id,noteTime) }, delay);

Обратите внимание, что вы передаете setTimeout целое функциональное выражение, поэтому он будет удерживать анонимную функцию и выполнять ее только в конце задержки.

Вы также можете передать setTimeout ссылку, так как ссылка не выполняется немедленно, но затем вы не можете передавать аргументы:

setTimeout(playNote, delay);

Примечание:

Для повторных событий вы можете использовать setInterval() , и вы можете установить setInterval() на переменную и использовать переменную, чтобы остановить интервал с помощью clearInterval() .

Вы говорите, что используете setTimeout() в цикле for. Во многих ситуациях лучше использовать setTimeout() в рекурсивной функции. Это связано с тем, что в цикле for переменные, используемые в setTimeout(), не будут такими переменными, какими они были, когда начался setTimeout(), но переменные, как они есть после задержки при запуске функции.

Просто используйте рекурсивную функцию, чтобы обойти эту проблему.

Использование рекурсии для обработки переменных времени задержки:

  // Set original delay
var delay = 500;

  // Call the function for the first time, to begin the recursion.
playNote(xxx, yyy);

  // The recursive function
function playNote(theId, theTime)
{
    // Do whatever has to be done
    // ...

    // Have the function call itself again after a delay, if necessary
    //   you can modify the arguments that you use here. As an
    //   example I add 20 to theTime each time. You can also modify
    //   the delay. I add 1/2 a second to the delay each time as an example.
    //   You can use a condition to continue or stop the recursion

    delay += 500;

    if (condition)
    { setTimeout(function() { playNote(theID, theTime + 20) }, delay); }
}

0
задан user3109672 18 January 2019 в 12:09
поделиться

1 ответ

Хорошо, я забыл добавить код, чтобы получить и снять глобальную блокировку интерпретатора для некоторого класса функций. Извините за глупый вопрос.

Имейте веру в детей Python.

0
ответ дан user3109672 18 January 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: