我目前正在尝试为我的程序创建一个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
什么时候'g_main_loop_run'返回?另外'play'应该可以将'uri'推到另一个处理'std :: async'和其内部返回的'std :: future'的系统(或子系统);或使用'std :: thread' – KABoissonneault
是的,问题是我不明白async()的未来等待函数返回,并且'g_main_loop_run'通常在几分钟后返回(当流完成时/停止):(我现在使用什么@KABoissonneault建议:'线程t(&音频:: playAsync,这个,uri); t.detach();'它工作得很好:)但我不明白你的意思'uri'变量,这样它就可以毫无问题地传递给'playAsync'。编辑:哦:D我刚刚意识到你发布了这半小时前,对不起^^ – tagelicht