diff options
-rw-r--r-- | archivemodel.cpp | 19 | ||||
-rw-r--r-- | archivemodel.h | 4 | ||||
-rw-r--r-- | newmoviewizard.cpp | 3 |
3 files changed, 19 insertions, 7 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 4f4c69e..58bfc24 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -52,8 +52,9 @@ ArchiveModel::~ArchiveModel(){ * crashes when we exit and a collector is * still runnning */ foreach(ArchiveCollector *c, mCollectors){ - c->cancel(); + c->setCancelled(true); c->wait(); + c->setCancelled(false); } } @@ -519,7 +520,9 @@ void ArchiveModel::refresh(){ emit message(tr("Reading archive data...")); foreach(ArchiveCollector *c, mCollectors){ if(c->isRunning()){ - c->cancel(); + c->setCancelled(true); + c->wait(); + c->setCancelled(false); } c->start(); } @@ -539,6 +542,9 @@ void ArchiveModel::setWindowTitle(){ void ArchiveModel::collectorFinished(QObject *thread){ ArchiveCollector *t = qobject_cast<ArchiveCollector*>(thread); + if(t->isCancelled()){ + return; + } SmTreeItem *rootCopy = t->rootItem(); int sortOrder = t->sortOrder(); if(sortOrder == mOrder){ @@ -569,6 +575,7 @@ void ArchiveModel::emitDatabaseError(const QSqlError &e){ } void ArchiveModel::writeCache(int o, SmTreeItem *rItem){ + mCacheMx.lock(); QFile cache(cacheFile(o)); cache.open(QIODevice::WriteOnly); QDataStream stream(&cache); @@ -578,11 +585,12 @@ void ArchiveModel::writeCache(int o, SmTreeItem *rItem){ for(int i = 0; i < rItem->childCount(); ++i){ writeRecursive(rItem->child(i), stream); } + mCacheMx.unlock(); } void ArchiveModel::writeRecursive(SmTreeItem *start, QDataStream &stream){ if(start->childCount()){ - stream << (quint64)start->parent() << (qint64)start; + stream << (qint64)start->parent() << (qint64)start; writeItem(start, stream); for(int i = 0; i < start->childCount(); ++i){ writeRecursive(start->child(i), stream); @@ -600,6 +608,7 @@ void ArchiveModel::writeItem(SmTreeItem *item, QDataStream &stream){ } SmTreeItem *ArchiveModel::readCache(int o){ + QMutexLocker l(&mCacheMx); QFile cache(cacheFile(o)); if(!cache.exists() || !cache.size()){ return 0; @@ -906,9 +915,9 @@ SmTreeItem *ArchiveCollector::rootItem(){ return retval; } -void ArchiveCollector::cancel(){ +void ArchiveCollector::setCancelled(bool cancel){ QMutexLocker l(&mCancelledMx); - mCancelled = true; + mCancelled = cancel; } void ArchiveCollector::run(){ diff --git a/archivemodel.h b/archivemodel.h index 74a2715..8323385 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -82,6 +82,7 @@ class ArchiveModel : public SmTreeModel { QHash<QString, int> mAvailableOrders; QList<ArchiveCollector*> mCollectors; QHash<int, QIcon> mNodeIcons; + QMutex mCacheMx; int mOrder; }; @@ -116,7 +117,8 @@ class ArchiveCollector : public QThread { explicit ArchiveCollector(int numFields, int order, QObject *parent = 0); SmTreeItem *rootItem(); int sortOrder() const { return mSortOrder; } - void cancel(); + void setCancelled(bool cancel); + bool isCancelled() const { return mCancelled; } signals: void message(const QString message); diff --git a/newmoviewizard.cpp b/newmoviewizard.cpp index 9c12dca..d956540 100644 --- a/newmoviewizard.cpp +++ b/newmoviewizard.cpp @@ -112,7 +112,6 @@ void NewMovieWizard::accept(){ //handle files MovieInfoPage *movieInfoPage = qobject_cast<MovieInfoPage*>(page(0)); WizardTreeModel *wizardModel = movieInfoPage->model(); - int quality = field("quality").toInt(); QSqlQuery insertFilesQ(db); insertFilesQ.prepare("INSERT INTO files (iseriespart_id, tfilename, cmd5sum, bisize, sifiletype, sifileno, siquality, cpicsize, iduration) VALUES(:ipid, :tfn, :md5, :size, :ft, :fno, :qual, :psize, :dur)"); QHash<QString, QString> md5Sums; @@ -126,9 +125,11 @@ void NewMovieWizard::accept(){ qint64 secs = 0; QString picSize; int type = fData.value(WizardTreeModel::FileType).toInt(); + QVariant quality; if(type == ArchiveFilesModel::Movie){ QVariantMap m = Helper::ffmpegData(fullPath); secs = m.value("duration").toDouble(); + quality = field("quality").toInt(); }else{ QPixmap pix(fullPath); picSize = QString("%1x%2").arg(QString::number(pix.width())).arg(QString::number(pix.height())); |