我正在写一个GTK / VLC程序。与普通媒体播放器一样,我的节目应该如下:
playlist
(使用GtkTreeView
实施),player
(使用libvlc_media_player
实施)播放所选媒体。player
会引发一个事件。此事件用于调用以下例程:
playlist
g_signal_emit
功能用于模拟播放列表中的双击事件,以便选择下一个媒体。问题是player
的函数“play”不能被player
自身回调的同一个线程调用。
我怎样才能从这个混乱中走出来?
**增加** vlc信号似乎是异步的,而gtk则没有。有没有办法发出异步gtk的事件?
答案 0 :(得分:2)
您必须启动另一个线程(或将消息发送到另一个线程)并在那里运行命令。它是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();
}
}
}