1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-08 07:07:05 +02:00

Allow creating basic data types from QtConcurrent::run

When QObjects are created from QtConcurrent::run they live in a pooled thread that doesn't handle events/signals/slots properly
This commit is contained in:
Dominik Schmidt
2016-02-18 00:51:02 +01:00
parent dc80d19a08
commit 018e4276a9
6 changed files with 25 additions and 8 deletions

View File

@@ -33,6 +33,7 @@
#include <QReadWriteLock> #include <QReadWriteLock>
#include <QPixmapCache> #include <QPixmapCache>
#include <QCoreApplication>
using namespace Tomahawk; using namespace Tomahawk;
@@ -75,6 +76,7 @@ Album::get( const Tomahawk::artist_ptr& artist, const QString& name, bool autoCr
} }
album_ptr album = album_ptr( new Album( name, artist ), &Album::deleteLater ); album_ptr album = album_ptr( new Album( name, artist ), &Album::deleteLater );
album->moveToThread( QCoreApplication::instance()->thread() );
album->setWeakRef( album.toWeakRef() ); album->setWeakRef( album.toWeakRef() );
album->loadId( autoCreate ); album->loadId( autoCreate );
s_albumsByName.insert( key, album ); s_albumsByName.insert( key, album );

View File

@@ -36,6 +36,7 @@
#include <QReadWriteLock> #include <QReadWriteLock>
#include <QPixmapCache> #include <QPixmapCache>
#include <QCoreApplication>
using namespace Tomahawk; using namespace Tomahawk;
@@ -109,6 +110,7 @@ Artist::get( unsigned int id, const QString& name )
} }
artist_ptr a = artist_ptr( new Artist( id, name ), &Artist::deleteLater ); artist_ptr a = artist_ptr( new Artist( id, name ), &Artist::deleteLater );
a->moveToThread( QCoreApplication::instance()->thread() );
a->setWeakRef( a.toWeakRef() ); a->setWeakRef( a.toWeakRef() );
s_artistsByName.insert( key, a ); s_artistsByName.insert( key, a );

View File

@@ -33,6 +33,7 @@
#include <QtAlgorithms> #include <QtAlgorithms>
#include <QDebug> #include <QDebug>
#include <QCoreApplication>
using namespace Tomahawk; using namespace Tomahawk;
@@ -47,6 +48,7 @@ Query::get( const QString& artist, const QString& track, const QString& album, c
autoResolve = false; autoResolve = false;
query_ptr q = query_ptr( new Query( Track::get( artist, track, album ), qid, autoResolve ), &QObject::deleteLater ); query_ptr q = query_ptr( new Query( Track::get( artist, track, album ), qid, autoResolve ), &QObject::deleteLater );
q->moveToThread( QCoreApplication::instance()->thread() );
q->setWeakRef( q.toWeakRef() ); q->setWeakRef( q.toWeakRef() );
if ( autoResolve ) if ( autoResolve )

View File

@@ -35,6 +35,8 @@
#include "Track.h" #include "Track.h"
#include "Typedefs.h" #include "Typedefs.h"
#include <QCoreApplication>
using namespace Tomahawk; using namespace Tomahawk;
static QHash< QString, result_wptr > s_results; static QHash< QString, result_wptr > s_results;
@@ -69,6 +71,7 @@ Result::get( const QString& url, const track_ptr& track )
} }
result_ptr r = result_ptr( new Result( url, track ), &Result::deleteLater ); result_ptr r = result_ptr( new Result( url, track ), &Result::deleteLater );
r->moveToThread( QCoreApplication::instance()->thread() );
r->setWeakRef( r.toWeakRef() ); r->setWeakRef( r.toWeakRef() );
s_results.insert( url, r ); s_results.insert( url, r );
@@ -132,21 +135,25 @@ Result::deleteLater()
void void
Result::onResolverRemoved( Tomahawk::Resolver* resolver ) Result::onResolverRemoved( Tomahawk::Resolver* resolver )
{ {
QMutexLocker lock( &m_mutex ); m_mutex.lock();
if ( m_resolver.data() == resolver ) if ( m_resolver.data() == resolver )
{ {
m_resolver = 0; m_resolver = 0;
m_mutex.unlock();
emit statusChanged(); emit statusChanged();
} }
else
{
m_mutex.unlock();
}
} }
collection_ptr collection_ptr
Result::resolvedByCollection() const Result::resolvedByCollection() const
{ {
QMutexLocker lock( &m_mutex );
return m_collection; return m_collection;
} }
@@ -325,9 +332,7 @@ Result::onOffline()
void void
Result::setResolvedByCollection( const Tomahawk::collection_ptr& collection, bool emitOnlineEvents ) Result::setResolvedByCollection( const Tomahawk::collection_ptr& collection, bool emitOnlineEvents )
{ {
m_mutex.lock();
m_collection = collection; m_collection = collection;
m_mutex.unlock();
if ( emitOnlineEvents ) if ( emitOnlineEvents )
{ {

View File

@@ -37,6 +37,7 @@
#include <QtAlgorithms> #include <QtAlgorithms>
#include <QDateTime> #include <QDateTime>
#include <QReadWriteLock> #include <QReadWriteLock>
#include <QCoreApplication>
using namespace Tomahawk; using namespace Tomahawk;
@@ -92,6 +93,7 @@ Track::get( const QString& artist, const QString& track, const QString& album, c
} }
track_ptr t = track_ptr( new Track( artist, track, album, albumArtist, duration, composer, albumpos, discnumber ), &Track::deleteLater ); track_ptr t = track_ptr( new Track( artist, track, album, albumArtist, duration, composer, albumpos, discnumber ), &Track::deleteLater );
t->moveToThread( QCoreApplication::instance()->thread() );
t->setWeakRef( t.toWeakRef() ); t->setWeakRef( t.toWeakRef() );
s_tracksByName.insert( key, t ); s_tracksByName.insert( key, t );

View File

@@ -19,8 +19,7 @@
#include "TrackData.h" #include "TrackData.h"
#include <QtAlgorithms>
#include <QReadWriteLock>
#include "audio/AudioEngine.h" #include "audio/AudioEngine.h"
#include "collection/Collection.h" #include "collection/Collection.h"
@@ -41,6 +40,10 @@
#include "PlaylistEntry.h" #include "PlaylistEntry.h"
#include "SourceList.h" #include "SourceList.h"
#include <QtAlgorithms>
#include <QReadWriteLock>
#include <QCoreApplication>
using namespace Tomahawk; using namespace Tomahawk;
QHash< QString, trackdata_wptr > TrackData::s_trackDatasByName = QHash< QString, trackdata_wptr >(); QHash< QString, trackdata_wptr > TrackData::s_trackDatasByName = QHash< QString, trackdata_wptr >();
@@ -84,6 +87,7 @@ TrackData::get( unsigned int id, const QString& artist, const QString& track )
} }
trackdata_ptr t = trackdata_ptr( new TrackData( id, artist, track ), &TrackData::deleteLater ); trackdata_ptr t = trackdata_ptr( new TrackData( id, artist, track ), &TrackData::deleteLater );
t->moveToThread( QCoreApplication::instance()->thread() );
t->setWeakRef( t.toWeakRef() ); t->setWeakRef( t.toWeakRef() );
s_trackDatasByName.insert( key, t ); s_trackDatasByName.insert( key, t );