2016-08-22 70 views
1

我目前正在尝试为我的程序创建一个C++包装来使用GStreamer。C++异步使程序无响应

所以我创建了一个类“音频”​​与一个方法“播放”,启动一个流。由于内部调用g_main_loop_run,直到主循环退出才会返回。 我不想要这种行为,因此我试图在play方法中调用另一个方法的async,然后启动主循环并允许play方法返回。

目前,它看起来像这样:

void play(const char* uri) { 
     stop(); 

     if (uri) { 
      g_object_set(G_OBJECT(pipeline), "uri", uri, NULL); 
     } else { 
      cout << "Please specify an URI you wish to play" << endl; 
      return; 
     } 
     gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING); 

     auto handle = async(launch::async, &Audio::playAsync, this, uri); 
    } 

    void playAsync(const char* uri) { 
      cout << "playing async" << endl; 
     g_main_loop_run(this->getLoop()); 
    } 

但结果是,该方案也越来越没有反应......的playAsync方法被调用(它的打印COUT),并开始播放,并继续播放,但是GUI变得完全没有反应,只能通过杀死程序来退出。

对我有帮助吗?

问候,tagelicht

+0

什么时候'g_main_loop_run'返回?另外'play'应该可以将'uri'推到另一个处理'std :: async'和其内部返回的'std :: future'的系统(或子系统);或使用'std :: thread' – KABoissonneault

+0

是的,问题是我不明白async()的未来等待函数返回,并且'g_main_loop_run'通常在几分钟后返回(当流完成时/停止):(我现在使用什么@KABoissonneault建议:'线程t(&音频:: playAsync,这个,uri); t.detach();'它工作得很好:)但我不明白你的意思'uri'变量,这样它就可以毫无问题地传递给'playAsync'。编辑:哦:D我刚刚意识到你发布了这半小时前,对不起^^ – tagelicht

回答

2

当它超出范围异步返回前途和未来必须完成(它等待的结果)。 这与使用async(...);完全一样,因为处理在分配之后就不在范围内。

+0

好的谢谢你的答复,但如果将来必须完成,我该如何告诉它只是异步调用函数,而不是等待结果? – tagelicht

+3

@tagelicht将'std :: future'移出函数并让它在其他地方等待,或者使用'std :: thread'和'std :: thread :: detach' – KABoissonneault

+0

非常感谢:) – tagelicht