2016-08-22 50 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