libvlc - 无法从回调中调用函数

时间:2014-08-27 18:04:54

标签: c++ c gtk vlc

我正在写一个GTK / VLC程序。与普通媒体播放器一样,我的节目应该如下:

  1. 双击playlist(使用GtkTreeView实施),player(使用libvlc_media_player实施)播放所选媒体。
  2. 当达到媒体结束时,player会引发一个事件。此事件用于调用以下例程:
    • playlist
    • 中搜索下一个媒体
    • g_signal_emit功能用于模拟播放列表中的双击事件,以便选择下一个媒体。
  3. 问题是player的函数“play”不能被player自身回调的同一个线程调用。

    我怎样才能从这个混乱中走出来?

    **增加** vlc信号似乎是异步的,而gtk则没有。有没有办法发出异步gtk的事件?

1 个答案:

答案 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();
        }
    }
}