2014-08-27 63 views
0

我正在編寫一個GTK/VLC程序。作爲普通媒體播放器,我的程序應該採取行動如下:libvlc - 無法從回調調用函數

  1. playlist(使用GtkTreeView實現)雙擊使player播放所選的媒體(使用libvlc_media_player實現)。
  2. 達到媒體結束時,player引發事件。此事件被用來調用一個例程:
    • playlist
    • 搜索下一個媒體g_signal_emit功能是用來模擬在播放列表中雙擊事件,以選擇下一個媒體。

的問題是,player的功能「玩」不能由player本身回調的同一個線程調用。

我該如何擺脫這個混亂?

**添加** vlc信號似乎是異步的,而gtk的信號不同步。有沒有辦法異步發射gtk的事件?

回答

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