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

Properly delete scanner in-thread

This commit is contained in:
Jeff Mitchell
2011-05-03 22:13:16 -04:00
parent a81bca6ce1
commit f4508fc79a
2 changed files with 38 additions and 23 deletions

View File

@@ -43,7 +43,6 @@ ScanManager::instance()
ScanManager::ScanManager( QObject* parent ) ScanManager::ScanManager( QObject* parent )
: QObject( parent ) : QObject( parent )
, m_scanner( 0 )
, m_musicScannerThreadController( 0 ) , m_musicScannerThreadController( 0 )
, m_currScannerPaths() , m_currScannerPaths()
, m_dirWatcher( 0 ) , m_dirWatcher( 0 )
@@ -81,25 +80,32 @@ ScanManager::~ScanManager()
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
if( m_musicScannerThreadController ) if ( !m_scanner.isNull() )
{ {
m_musicScannerThreadController->quit(); QMetaObject::invokeMethod( m_scanner.data(), "deleteLater", Qt::QueuedConnection );
while( !m_scanner.isNull() )
while( !m_musicScannerThreadController->isFinished() )
{ {
qDebug() << Q_FUNC_INFO << " scanner not deleted, processing events";
QCoreApplication::processEvents( QEventLoop::AllEvents, 200 ); QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
TomahawkUtils::Sleep::msleep( 100 ); TomahawkUtils::Sleep::msleep( 100 );
} }
if( m_scanner ) if ( m_musicScannerThreadController )
m_musicScannerThreadController->quit();
if( m_musicScannerThreadController )
{ {
delete m_scanner; while( !m_musicScannerThreadController->isFinished() )
m_scanner = 0; {
qDebug() << Q_FUNC_INFO << " scanner thread controller not finished, processing events";
QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
TomahawkUtils::Sleep::msleep( 100 );
} }
delete m_musicScannerThreadController; delete m_musicScannerThreadController;
m_musicScannerThreadController = 0; m_musicScannerThreadController = 0;
} }
}
} }
@@ -138,7 +144,7 @@ ScanManager::runManualScan( const QStringList& paths, bool recursive )
if( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) ) if( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) )
return; return;
if ( !m_musicScannerThreadController && !m_scanner ) //still running if these are not zero if ( !m_musicScannerThreadController && m_scanner.isNull() ) //still running if these are not zero
{ {
m_musicScannerThreadController = new QThread( this ); m_musicScannerThreadController = new QThread( this );
QStringList allPaths = paths; QStringList allPaths = paths;
@@ -147,13 +153,13 @@ ScanManager::runManualScan( const QStringList& paths, bool recursive )
if( !allPaths.contains( path ) ) if( !allPaths.contains( path ) )
allPaths << path; allPaths << path;
} }
m_scanner = new MusicScanner( paths, recursive ); m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths, recursive ) );
m_scanner->moveToThread( m_musicScannerThreadController ); m_scanner.data()->moveToThread( m_musicScannerThreadController );
connect( m_scanner, SIGNAL( finished() ), SLOT( scannerFinished() ) ); connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) );
connect( m_scanner, SIGNAL( addWatchedDirs( const QStringList & ) ), SLOT( addWatchedDirs( const QStringList & ) ) ); connect( m_scanner.data(), SIGNAL( addWatchedDirs( const QStringList & ) ), SLOT( addWatchedDirs( const QStringList & ) ) );
connect( m_scanner, SIGNAL( removeWatchedDir( const QString & ) ), SLOT( removeWatchedDir( const QString & ) ) ); connect( m_scanner.data(), SIGNAL( removeWatchedDir( const QString & ) ), SLOT( removeWatchedDir( const QString & ) ) );
m_musicScannerThreadController->start( QThread::IdlePriority ); m_musicScannerThreadController->start( QThread::IdlePriority );
QMetaObject::invokeMethod( m_scanner, "startScan" ); QMetaObject::invokeMethod( m_scanner.data(), "startScan" );
m_deferredDirs[recursive].clear(); m_deferredDirs[recursive].clear();
} }
else else
@@ -249,9 +255,18 @@ void
ScanManager::scannerQuit() ScanManager::scannerQuit()
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
connect( m_scanner, SIGNAL( destroyed( QObject* ) ), SLOT( scannerDestroyed( QObject* ) ) ); connect( m_scanner.data(), SIGNAL( destroyed( QObject* ) ), SLOT( scannerDestroyed( QObject* ) ) );
delete m_scanner;
m_scanner = 0; if ( !m_scanner.isNull() )
{
QMetaObject::invokeMethod( m_scanner.data(), "deleteLater", Qt::QueuedConnection );
while( !m_scanner.isNull() )
{
qDebug() << Q_FUNC_INFO << " scanner not deleted, processing events";
QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
TomahawkUtils::Sleep::msleep( 100 );
}
}
} }

View File

@@ -64,7 +64,7 @@ private slots:
private: private:
static ScanManager* s_instance; static ScanManager* s_instance;
MusicScanner* m_scanner; QWeakPointer< MusicScanner > m_scanner;
QThread* m_musicScannerThreadController; QThread* m_musicScannerThreadController;
QStringList m_currScannerPaths; QStringList m_currScannerPaths;
QFileSystemWatcher* m_dirWatcher; QFileSystemWatcher* m_dirWatcher;