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

More thread-safe

This commit is contained in:
Jeff Mitchell
2011-02-15 13:23:09 -05:00
parent c561a2a845
commit 9bc6194d2b
4 changed files with 50 additions and 12 deletions

View File

@@ -107,21 +107,36 @@ MusicScanner::listerFinished( const QMap<QString, unsigned int>& newmtimes )
foreach( const QString& s, m_skippedFiles ) foreach( const QString& s, m_skippedFiles )
qDebug() << s; qDebug() << s;
m_dirListerThreadController->quit(); QMetaObject::invokeMethod( this, "quitLister" );
m_dirLister->deleteLater();
} }
void
MusicScanner::quitLister()
{
qDebug() << Q_FUNC_INFO;
if( m_dirListerThreadController->isRunning() )
{
qDebug() << "Scan thread still running, not deleting yet";
m_dirListerThreadController->quit();
QMetaObject::invokeMethod( this, "quitLister" );
}
else
{
qDebug() << "deleting dir lister";
m_dirLister->deleteLater();
m_dirLister = 0;
}
}
void void
MusicScanner::listerDestroyed( QObject* dirLister ) MusicScanner::listerDestroyed( QObject* dirLister )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
m_dirLister = 0;
m_dirListerThreadController->deleteLater(); m_dirListerThreadController->deleteLater();
m_dirListerThreadController = 0; m_dirListerThreadController = 0;
emit finished();
} }
void void
MusicScanner::commitBatch( const QVariantList& tracks ) MusicScanner::commitBatch( const QVariantList& tracks )
{ {

View File

@@ -89,7 +89,7 @@ public:
signals: signals:
//void fileScanned( QVariantMap ); //void fileScanned( QVariantMap );
void finished( int, int ); void finished();
void batchReady( const QVariantList& ); void batchReady( const QVariantList& );
private: private:
@@ -97,6 +97,7 @@ private:
private slots: private slots:
void listerFinished( const QMap<QString, unsigned int>& newmtimes ); void listerFinished( const QMap<QString, unsigned int>& newmtimes );
void quitLister();
void listerDestroyed( QObject* dirLister ); void listerDestroyed( QObject* dirLister );
void scanFile( const QFileInfo& fi ); void scanFile( const QFileInfo& fi );
void startScan(); void startScan();

View File

@@ -29,9 +29,13 @@ ScanManager::ScanManager( QObject* parent )
ScanManager::~ScanManager() ScanManager::~ScanManager()
{ {
qDebug() << Q_FUNC_INFO;
s_instance = 0; s_instance = 0;
if( m_musicScannerThreadController )
{
m_musicScannerThreadController->quit(); m_musicScannerThreadController->quit();
m_musicScannerThreadController->deleteLater(); m_musicScannerThreadController->deleteLater();
}
m_musicScannerThreadController = 0; m_musicScannerThreadController = 0;
m_scanner = 0; m_scanner = 0;
} }
@@ -52,22 +56,39 @@ ScanManager::runManualScan( const QString& path )
if ( !m_musicScannerThreadController && !m_scanner ) //still running if these are not zero if ( !m_musicScannerThreadController && !m_scanner ) //still running if these are not zero
{ {
m_musicScannerThreadController = new QThread( this ); m_musicScannerThreadController = new QThread( this );
MusicScanner* m_scanner = new MusicScanner( path ); m_scanner = new MusicScanner( path );
m_scanner->moveToThread( m_musicScannerThreadController ); m_scanner->moveToThread( m_musicScannerThreadController );
connect( m_scanner, SIGNAL( destroyed( QObject* ) ), this, SLOT( scannerDestroyed( QObject* ) ) ); connect( m_scanner, SIGNAL( finished() ), SLOT( scannerFinished() ) );
connect( m_scanner, SIGNAL( destroyed( QObject* ) ), SLOT( scannerDestroyed( QObject* ) ) );
m_musicScannerThreadController->start( QThread::IdlePriority ); m_musicScannerThreadController->start( QThread::IdlePriority );
QMetaObject::invokeMethod( m_scanner, "startScan" ); QMetaObject::invokeMethod( m_scanner, "startScan" );
} }
else
qDebug() << "Could not run manual scan, old scan still running";
} }
void
ScanManager::scannerFinished()
{
qDebug() << Q_FUNC_INFO;
if( m_musicScannerThreadController->isRunning() )
{
qDebug() << "Scan thread still running, not deleting yet";
m_musicScannerThreadController->quit();
QMetaObject::invokeMethod( this, "scannerFinished" );
}
else
{
delete m_scanner;
m_scanner = 0;
}
}
void void
ScanManager::scannerDestroyed( QObject* scanner ) ScanManager::scannerDestroyed( QObject* scanner )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
m_musicScannerThreadController->quit();
m_musicScannerThreadController->deleteLater(); m_musicScannerThreadController->deleteLater();
m_musicScannerThreadController = 0; m_musicScannerThreadController = 0;
m_scanner = 0;
} }

View File

@@ -21,6 +21,7 @@ public:
void runManualScan( const QString& path ); void runManualScan( const QString& path );
private slots: private slots:
void scannerFinished();
void scannerDestroyed( QObject* scanner ); void scannerDestroyed( QObject* scanner );
void onSettingsChanged(); void onSettingsChanged();