[vlmc-devel] MediaLibraryModel: Avoid calling functions from the medialibrary thread
Hugo Beauzée-Luyssen
hugo at beauzee.fr
Thu Jul 13 09:51:14 CEST 2017
On Sat, Jun 24, 2017, at 12:49 PM, Yikai Lu wrote:
> vlmc | branch: master | Yikai Lu <luyikei.qmltu at gmail.com> | Sun Jun 25
> 03:07:48 2017 +0900| [e14eb6dc24560185065ebe68f9359defdd990209] |
> committer: Yikai Lu
>
> MediaLibraryModel: Avoid calling functions from the medialibrary thread
>
> > https://code.videolan.org/videolan/vlmc/commit/e14eb6dc24560185065ebe68f9359defdd990209
> ---
>
> src/Library/Library.cpp | 23 +++++++++++++++++------
> src/Library/MediaLibraryModel.cpp | 1 +
> src/Library/MediaLibraryModel.h | 10 ++++++----
> 3 files changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/src/Library/Library.cpp b/src/Library/Library.cpp
> index 8430d08a..a978e365 100644
> --- a/src/Library/Library.cpp
> +++ b/src/Library/Library.cpp
> @@ -212,7 +212,9 @@ Library::onMediaAdded(
> std::vector<medialibrary::MediaPtr> mediaList )
> {
> for ( auto m : mediaList )
> {
> - m_model->addMedia( m );
> + QMetaObject::invokeMethod( m_model, "addMedia",
> + Qt::QueuedConnection,
> + Q_ARG( medialibrary::MediaPtr, m ) );
> }
> }
>
> @@ -221,7 +223,9 @@ Library::onMediaUpdated(
> std::vector<medialibrary::MediaPtr> mediaList )
> {
> for ( auto m : mediaList )
> {
> - m_model->updateMedia( m );
> + QMetaObject::invokeMethod( m_model, "updateMedia",
> + Qt::QueuedConnection,
> + Q_ARG( medialibrary::MediaPtr, m ) );
> }
> }
>
> @@ -229,7 +233,9 @@ void
> Library::onMediaDeleted( std::vector<int64_t> mediaList )
> {
> for ( auto id : mediaList )
> - m_model->removeMedia( id );
> + QMetaObject::invokeMethod( m_model, "removeMedia",
> + Qt::QueuedConnection,
> + Q_ARG( int64_t, id ) );
> }
>
> void
> @@ -287,7 +293,8 @@ void
> Library::onDiscoveryCompleted( const std::string& entryPoint )
> {
> if ( entryPoint.empty() == true )
> - m_model->refresh();
> + QMetaObject::invokeMethod( m_model, "refresh",
> + Qt::QueuedConnection );
>
> emit discoveryCompleted( QString::fromStdString( entryPoint ) );
> }
> @@ -324,10 +331,14 @@ Library::onReloadCompleted( const std::string&
> entryPoint )
> if ( entryPoint.empty() == true )
> {
> for ( auto media : m_ml->videoFiles() )
> - m_model->addMedia( media );
> + QMetaObject::invokeMethod( m_model, "addMedia",
> + Qt::QueuedConnection,
> + Q_ARG( medialibrary::MediaPtr,
> media ) );
>
> for ( auto media : m_ml->audioFiles() )
> - m_model->addMedia( media );
> + QMetaObject::invokeMethod( m_model, "addMedia",
> + Qt::QueuedConnection,
> + Q_ARG( medialibrary::MediaPtr,
> media ) );
> }
> }
>
> diff --git a/src/Library/MediaLibraryModel.cpp
> b/src/Library/MediaLibraryModel.cpp
> index ecd1d1a8..e22581e2 100644
> --- a/src/Library/MediaLibraryModel.cpp
> +++ b/src/Library/MediaLibraryModel.cpp
> @@ -30,6 +30,7 @@ MediaLibraryModel::MediaLibraryModel(
> medialibrary::IMediaLibrary& ml, QObject *
> , m_ml( ml )
> , m_rowCount( 0 )
> {
> + qRegisterMetaType<medialibrary::MediaPtr>();
> }
>
> void MediaLibraryModel::addMedia( medialibrary::MediaPtr media )
> diff --git a/src/Library/MediaLibraryModel.h
> b/src/Library/MediaLibraryModel.h
> index 7729ff05..edddb73d 100644
> --- a/src/Library/MediaLibraryModel.h
> +++ b/src/Library/MediaLibraryModel.h
> @@ -46,16 +46,18 @@ public:
>
> explicit MediaLibraryModel( medialibrary::IMediaLibrary& ml, QObject
> *parent = 0 );
>
> - void addMedia( medialibrary::MediaPtr media );
> medialibrary::MediaPtr findMedia( qint64 mediaId );
> - void updateMedia( medialibrary::MediaPtr media );
> - bool removeMedia( int64_t media );
> - void refresh();
>
> virtual int rowCount( const QModelIndex &parent = QModelIndex() )
> const override;
> virtual QVariant data( const QModelIndex &index, int role =
> Qt::DisplayRole ) const override;
> virtual QHash<int, QByteArray> roleNames() const override;
>
> +public slots:
> + void addMedia( medialibrary::MediaPtr media );
> + void updateMedia( medialibrary::MediaPtr media );
> + bool removeMedia( int64_t media );
> + void refresh();
> +
> private:
> medialibrary::IMediaLibrary& m_ml;
>
>
> _______________________________________________
> Vlmc-devel mailing list
> Vlmc-devel at videolan.org
> https://mailman.videolan.org/listinfo/vlmc-devel
Any reason this is using QMetaObject::invokeMethod instead of a signal?
Also the medialibrary has a dedicated thread for notifications, so you
can do "long" operations there
--
Hugo Beauzée-Luyssen
hugo at beauzee.fr
More information about the Vlmc-devel
mailing list