Я пишу программу GTK/VLC. Как и в обычном медиаплеере, моя программа должна действовать следующим образом:
GtkTreeView
playlist
(реализованному с использованием GtkTreeView
) позволяет player
(реализованному с помощью libvlc_media_player
) воспроизводить выбранный носитель.player
поднимает событие. Это событие используется для вызова процедуры, которая: playlist
g_signal_emit
используется для имитации события двойного щелчка в g_signal_emit
воспроизведения, чтобы выбрать следующий носитель. Проблема в том, что функция "играть" player
не может быть вызвана тем же потоком обратного вызова самого player
.
Как я могу выбраться из этого беспорядка?
** Дополнения ** Сигналы vlc кажутся асинхронными, а gtk - нет. Есть ли способ генерировать асинхронные события gtk?
Вам нужно запустить другой поток (или отправить сообщение в другой поток) и запустить там команду. Это хорошо известная проблема с обратными вызовами в libvlc.
Вот как я это сделал:
void player::libvlc_event( const struct libvlc_event_t* event )
{
//come from another thread
if( libvlc_MediaPlayerEndReached == event->type ||
libvlc_MediaPlayerEncounteredError == event->type )
{
if( mode_single != get_playback_mode() ) {
//to avoid deadlock we should execute commands on another thread
std::thread th( &player::next, this );
th.detach();
}
}
}