Как работать с потоками в pygtk

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

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

5
задан zimio 1 May 2009 в 01:05
поделиться

2 ответа

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

Поэтому я дам вам несколько советов для чтения, затем рассуждайте на основе опыта.

Во-первых, вы, кажется, думаете, что можете поддерживать GUI только с помощью потоков. Это неправда. Вы также можете писать свой код асинхронно и делать все в однопоточном приложении. Twisted построен на этой модели программирования. Недавно я сделал сообщение в блоге , в котором объясняется, как я создал асинхронный интерфейс задач, и приведены примеры бегунов для CLI и GTK +. Вы можете посмотреть на эти примеры, чтобы увидеть, как задачи могут быть реализованы асинхронно, и пользовательский интерфейс все еще обновляется.

Во-вторых, если вы по какой-то причине предпочитаете использовать потоки, вам нужно немного разобраться с моделью потоков GTK +.

Начните с прочтения Часто задаваемых вопросов по PyGTK по теме , и вы можете найти эту запись в блоге легко понять. тоже.

Теперь перейдем к предположениям. Я предполагаю, что вы пытаетесь обновить свой GTK UI из потока, а не обрабатываете блокировку должным образом. Если это так, вам лучше отложить все обновления вашего пользовательского интерфейса, которые вы хотите сделать, из потоков в основной поток с помощью gobject.idle_add (). Таким образом, все вызовы пользовательского интерфейса будут выполняться из основного потока. Это более простая ментальная модель, которой нужно следовать при программировании.

Как только вы почувствуете, что действительно понимаете модели потоков и блокировок, вы можете рассмотреть возможность обновления пользовательского интерфейса из своих потоков, но легко пропустить thread_enter () / threads_leave ()

12
ответ дан 18 December 2019 в 14:51
поделиться

Вы можете использовать gtk.gdk.threads_init (), чтобы разрешить любому потоку изменять пользовательский интерфейс с соблюдением блокировки gtk.gdk.threads_enter () и gtk.gdk.theads_leave (), но , проблема в том, что он не работает в Windows. Я протестировал его на Linux и работает достаточно хорошо, но мне не удалось заставить его работать с win32.

=== Edit ===

Я просматривал это, вы можете использовать gobject .io_add_watch, чтобы проверить, есть ли что-то в вашем сокете, возьмите его и затем обновите графический интерфейс. проверьте мой пост об этом: Сокеты (и некоторые другие файлы) и PyGTK без потоков.

1
ответ дан 18 December 2019 в 14:51
поделиться
Другие вопросы по тегам:

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