現在、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
いつ 'g_main_loop_run'が返されますか?また 'play'はおそらく、' std :: async'とその返された 'std :: future'を内部的に扱う別のシステム(またはサブシステム)に' uri 'をプッシュするべきです。または、 'std :: thread'を使用します。 – KABoissonneault
はい、問題は、async()の未来が関数が戻るのを待っていることを理解できず、' g_main_loop_run'は通常、私は今、@KABoissonneaultが提案したものを使用しています: 'スレッドt(&Audio :: playAsync、this、uri); t.detach();' 'uri'変数を使用すると、問題なく' playAsync'に渡されます。編集:ああ:Dあなたはこの半時間前に投稿したことに気づいた、ごめんなさい^^ – tagelicht