मैं एक ऐप लिख रहा हूं जो क्यूटी का उपयोग करके एक साथ चल रहे कई libVlc उदाहरण एम्बेड करता है। ऐसा लगता है कि वीएलसी लाइब्रेरी में एक बग है जहां कभी-कभी libvlc_media_player_stop deadlocks को क्यूटी के जीयूआई थ्रेड से बुलाया जाता है। वीडियोलन मंचों में से एक पर, स्वीकृत समाधान स्टॉप फ़ंक्शन को किसी अन्य थ्रेड से कॉल करना था। मैं एक अलग धागे से रोकने के लिए कम से कम शामिल और बहुत ही बदसूरत विधि की तलाश में हूं। मैंने QThreadPool का उपयोग करने पर ध्यान दिया जो वास्तव में इस तरह की परिस्थितियों के लिए है, लेकिन मेरे विशेष मामले में, यह समाधान को सुंदर नहीं बनाता है।लिनक्स पर सी ++/क्यूटी में धागे को आग और भूलने का सबसे आसान तरीका क्या है?
यहाँ मेरी कोड का एक टुकड़ा है:
VlcWidget.h
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;
}
}
QthreadPool का उपयोग कर मेरे समाधान की तरह देखा:
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
@ थुगा - बहुत बहुत धन्यवाद!यही वही है जो मैं देख रहा था :) – Kulki
यदि आप QtConcurrent का उपयोग करने जा रहे हैं, तो मेरा सुझाव है कि आप इसे पहले पढ़ लें: http://comments.gmane.org/gmane.comp.lib.qt.devel/7942 – TheDarkKnight