summaryrefslogtreecommitdiffstats
path: root/archivemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archivemodel.cpp')
-rw-r--r--archivemodel.cpp19
1 files changed, 14 insertions, 5 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(){