我目前正在嘗試爲我的程序創建一個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