diff --git a/src/core/UBPersistenceManager.cpp b/src/core/UBPersistenceManager.cpp index 2601bcbe..a709348f 100644 --- a/src/core/UBPersistenceManager.cpp +++ b/src/core/UBPersistenceManager.cpp @@ -65,6 +65,7 @@ UBPersistenceManager * UBPersistenceManager::sSingleton = 0; UBPersistenceManager::UBPersistenceManager(QObject *pParent) : QObject(pParent) , mHasPurgedDocuments(false) + , mIsWorkerFinished(false) { mDocumentSubDirectories << imageDirectory; @@ -81,6 +82,7 @@ UBPersistenceManager::UBPersistenceManager(QObject *pParent) connect(mWorker, SIGNAL(error(QString)), this, SLOT(errorString(QString))); connect(mThread, SIGNAL(started()), mWorker, SLOT(process())); connect(mWorker, SIGNAL(finished()), mThread, SLOT(quit())); + connect(mWorker, SIGNAL(finished()), this, SLOT(onWorkerFinished())); connect(mWorker, SIGNAL(finished()), mWorker, SLOT(deleteLater())); connect(mThread, SIGNAL(finished()), mThread, SLOT(deleteLater())); connect(mWorker,SIGNAL(sceneLoaded(QByteArray,UBDocumentProxy*,int)),this,SLOT(onSceneLoaded(QByteArray,UBDocumentProxy*,int))); @@ -105,11 +107,24 @@ void UBPersistenceManager::destroy() sSingleton = NULL; } +void UBPersistenceManager::onWorkerFinished() +{ + mIsWorkerFinished = true; +} + UBPersistenceManager::~UBPersistenceManager() { if(mWorker) mWorker->applicationWillClose(); + QTime time; + time.start(); + qDebug() << "start waiting"; + + while(!mIsWorkerFinished) + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + qDebug() << "stop waiting after " << time.elapsed() << " ms"; + foreach(QPointer proxyGuard, documentProxies) { if (!proxyGuard.isNull()) @@ -117,7 +132,6 @@ UBPersistenceManager::~UBPersistenceManager() } // to be sure that all the scenes are stored on disk - mThread->wait(10*1000); } void UBPersistenceManager::errorString(QString error) diff --git a/src/core/UBPersistenceManager.h b/src/core/UBPersistenceManager.h index 1b297a84..687c5c9c 100644 --- a/src/core/UBPersistenceManager.h +++ b/src/core/UBPersistenceManager.h @@ -153,11 +153,13 @@ class UBPersistenceManager : public QObject UBPersistenceWorker* mWorker; QThread* mThread; + bool mIsWorkerFinished; private slots: void documentRepositoryChanged(const QString& path); void errorString(QString error); void onSceneLoaded(QByteArray,UBDocumentProxy*,int); + void onWorkerFinished(); };