2016-08-22 3 views
1

現在、GStreamerを使用するプログラムのC++ラッパーを作成しようとしています。C++ asyncによりプログラムが応答しなくなる

私はストリームを開始するメソッド "再生"でクラス "オーディオ"を作成しました。その内部に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'はおそらく、' std :: async'とその返された 'std :: future'を内部的に扱う別のシステム(またはサブシステム)に' uri 'をプッシュするべきです。または、 'std :: thread'を使用します。 – KABoissonneault

+0

はい、問題は、async()の未来が関数が戻るのを待っていることを理解できず、' g_main_loop_run'は通常、私は今、@KABoissonneaultが提案したものを使用しています: 'スレッドt(&Audio :: playAsync、this、uri); t.detach();' 'uri'変数を使用すると、問題なく' playAsync'に渡されます。編集:ああ:Dあなたはこの半時間前に投稿したことに気づいた、ごめんなさい^^ – tagelicht

答えて

2

それが範囲外になると非同期に未来と将来完成する必要があります(それは結果を待つ)を返します。 ハンドルが譲渡直後に範囲外になるのは、ちょうどasync(...);を使用するのとまったく同じです。

+0

あなたの返事に感謝しますが、将来は終了しなければならない場合、関数を非同期で呼び出して結果を待つように指示するにはどうすればいいですか? – tagelicht

+3

@tagelicht 'std :: future'を関数から外して、別の場所で待つか、' std :: thread'と 'std :: thread :: detach'を使います。 – KABoissonneault

+0

ありがとうございます:) – tagelicht

関連する問題