2013-05-29 6 views
0

Мне нужно использовать select() на bool, потому что модуль pygame.midi позволяет узнать, когда сообщение midi готово только через функцию Input.poll(), которая возвращает bool.python - select() on boolean variable

Если я проверю это значение простым способом, я делаю ожидание, и мой процессор работает на 100% все время.

Есть ли способ использовать select() или подобные функции, чтобы ждать переменную, чтобы изменить ее значение в контексте без автоматического создания событий?

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

+0

Вы имеете в виду ['select.select'] (http://docs.python.org/3.3/library/select.html#select.select)? Если это так, вы не можете этого сделать; он обрабатывает только файлы. Кроме того, как бы это помогло? Он просто собирается немедленно вернуться или заблокировать навсегда, так что у вас будет та же проблема, с которой вы начинаете. – abarnert

+0

Также, кто изменит значение переменной? Какой бы код ни делал это, вы можете просто вызвать его функцию вместо этого. – abarnert

+0

@abarnert pygame.midi isnt код, который он захочет изменить – cmd

ответ

2

При разработке игры, как правило, делают все, что в основной цикл. Если вы хотите, например, 50 кадров в секунду, то вы хотите пройти через этот цикл 50 раз в секунду. Если вы предполагаете, что вы не занимаете много времени, вы можете спать в течение 20 мс в конце каждой итерации.

Поэтому я думаю, что именно поэтому доступен только опрос, вы должны проверить, загружен ли миди в ваш цикл. Если да, то вы можете что-то с этим сделать, иначе вы продолжите рендеринг или что-то еще. Вообще, создавая игры и приложения, которые должны иметь согласованные fps, вы не хотите ждать какого-либо события.

+0

спасибо, что я решил, ожидая несколько миллисекунд за каждый цикл, я не разрабатываю игру, но midi «переводчик», который изменяет поведение midi-устройства и отправляет midi в программные синтезаторы, поэтому у меня нет предела fps и я хотел кое-что, что могло бы «проснуться» в моей программе, когда кто-то коснулся миди-устройства, но ждать 10 мс во многом достаточно, чтобы компьютер работал очень хорошо, и переводчик быстро реагировал – mellotanica

0

Если ваш вход не имеет возможности запускать события, вы должны проверить его на таймере.

В большинстве игр ваш основной цикл событий уже имеет некоторый код «ограничителя кадра», поэтому цикл события работает не более 50 раз/сек. Таким образом, вы можете просто poll один раз за цикл событий. Если нет, вам по существу придется добавить ограничитель кадров.

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