Qtを使用して複数のlibVlcインスタンスを同時に実行するアプリを作成しています。 QtのGUIスレッドから呼び出されるとlibvlc_media_player_stopがデッドロックすることがあるvlcライブラリにバグがあるようです。 videolanフォーラムの1つでは、受け入れられた解決策は別のスレッドからstop関数を呼び出すことでした。私は別のスレッドから停止を呼び出すために、少なくとも関与していない、あまりにも醜い方法を探しています。私はQThreadPoolを使ってみました。これは、この種の状況を正確に意味していますが、私の特別なケースでは、解決策をあまり美しくしません。ここでLinux上でC++/Qtのスレッドを起動して忘れる最も簡単な方法は何ですか?
は、私のコードの一部です:
VlcWidget.h
QthreadPoolを使用してclass VlcWidget : public QWidget
{
Q_OBJECT
private:
// State
bool _isPlaying;
// The streaming source, title and quality data
VideoData _videoData;
VIDEO_QUALITY _quality;
// LibVlc related members
libvlc_instance_t *_vlcInstance;
libvlc_media_player_t *_vlcMediaPlayer;
libvlc_media_t *_vlcMedia;
int _vlcTrackID;
}
VlcWidget.c
void VlcWidget::Play()
{
if(_videoData.Source() != "" && !_isPlaying)
{
// Create a new media descriptor
_vlcMedia = libvlc_media_new_location(
_vlcInstance,
_videoData.Source().toStdString().c_str());
// Tell the user about incorrect URL
if(_vlcMedia == NULL)
{
QMessageBox::information(this,
_videoData.Title(),
"Unable to open source Url.\nPlease check the source and try again.");
return;
}
libvlc_media_player_set_media(_vlcMediaPlayer, _vlcMedia);
libvlc_media_release(_vlcMedia);
libvlc_media_player_set_xwindow(_vlcMediaPlayer, parentWidget()->winId());
libvlc_media_player_play(_vlcMediaPlayer);
_vlcTrackID = libvlc_audio_get_track(_vlcMediaPlayer);
_isPlaying = true;
}
}
void VlcWidget::Stop()
{
if(_isPlaying)
{
libvlc_media_player_stop(_vlcMediaPlayer);
_vlcTrackID = -1;
_isPlaying = false;
}
}
私のソリューションは、ように見えた:
class AsyncVlcPlay : public QRunnable
{
private:
// State
bool *_isPlaying;
// LibVlc related members
libvlc_instance_t *_vlcInstance;
libvlc_media_player_t *_vlcMediaPlayer;
libvlc_media_t *_vlcMedia;
int *_vlcTrackID;
public:
virtual void run();
}
そして、 AsyncVlcPl ay :: run()は、VlcWidget :: Play()が単純なロックを追加した場合とまったく同じ動作をします。また、VlcWidget :: Stop()にも同様のクラスが必要です。私は達成しようとしているものに対して2つの新しいクラスが本当に必要ではないので、私はこの解決策が嫌いです。それより悪い点は、VlcWidgetsプライベートメンバーを別のクラスのオブジェクトに渡す必要があるということです。私はあなたに気づいていない非常に簡単な方法があると確信しています。皆さんのうちの一人が私を助けてくれることを願っています。ありがとう!
(実際には、私は本当に別のスレッド上にある)(再生:: VlcWidgetは必要ありませんが、私はプレーを続けると対称を停止したい)
たぶん[QtConcurrent](HTTP ://qt-project.org/doc/qt-4.8/qtconcurrentrun.html)があなたが探しているものです。 – thuga
@thuga - ありがとう!それはまさに私が探していたものです:) – Kulki
QtConcurrentを使うつもりなら、まずこれをお読みください:http://comments.gmane.org/gmane.comp.lib.qt.devel/7942 – TheDarkKnight