Как прервать выполнение функции в дочернем процессе, чтобы воспроизвести и приостановить воспроизведение звука с помощью Pyglet? - PullRequest
0 голосов
/ 16 сентября 2018

Я пишу приложение на Python (определенно не подходит для этой задачи, но я все равно делаю это). Часть приложения требует аудиоплеер, для которого я использую Pyglet, так как он кажется самым простым в использовании и делает то, что мне нужно, чтобы иметь возможность (загружать OGG, MP3 и WAV; воспроизводить аудио; приостанавливать звук ; получить текущую метку времени).

Я понимаю, что мне нужно будет запустить аудио материал в отдельном дочернем процессе (или как бы это ни обрабатывал многопроцессорный процесс, я полагаю, подпроцесс). Однако запуск pyglet.app.run () по существу блокирует процесс до тех пор, пока не закончится воспроизведение звука. Я не вижу способа заставить процесс приостановиться, поскольку вы не можете получить доступ к адресному пространству процесса извне процесса (поэтому я не могу запустить процесс, а затем запустить player.pause ()).

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

1 Ответ

0 голосов
/ 17 сентября 2018

Как и большинство GUI-структур, pyglet использует так называемый «цикл обработки событий». Это то, что началось с pyglet.app.run(). Это действительно блокирует текущий поток (не процесс) и планирует все события, которые происходят в структуре GUI. Если вы хотите запустить свои собственные вещи между ними, вы должны сделать это через цикл обработки событий, см. https://pyglet.readthedocs.io/en/latest/programming_guide/time.html#guide-calling-functions-periodically.

В качестве альтернативы, вы можете попытаться создать новый поток (не процесс), но тогда вам нужно позаботиться о доступе к вещам, которые потенциально также доступны из цикла событий pyglet.

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

...