]> vaikene.ee Git - evaf/blobdiff - src/apps/FileFinder/Engine/engine.cpp
Improved canceling and terminating the worker thread.
[evaf] / src / apps / FileFinder / Engine / engine.cpp
index b9fae0eddd917263fc16288bc4f2042406f5cd4a..8ed0f7ca7069104020ccb7643f23b53fd0dfd371 100644 (file)
@@ -235,6 +235,13 @@ Internal::Worker::Worker(QObject * parent)
     , mBusy(false)
 {
     setObjectName(QString("%1.Worker").arg(VER_MODULE_NAME_STR));
+
+    EVAF_INFO("%s created", qPrintable(objectName()));
+}
+
+Internal::Worker::~Worker()
+{
+    EVAF_INFO("%s destroyed", qPrintable(objectName()));
 }
 
 void Internal::Worker::cancel()
@@ -278,6 +285,9 @@ void Internal::Worker::run()
     forever {
         QMutexLocker lock(&mLock);
 
+        if (mDoTerminate)
+            break;
+
         mSomethingToDo.wait(&mLock);
 
         if (mDoTerminate)
@@ -304,8 +314,10 @@ void Internal::Worker::run()
 
             lock.relock();
             mBusy = false;
+            bool c = mDoCancel;
+            lock.unlock();
 
-            emit finished(mDoCancel);
+            emit finished(c);
         }
     }
 }
@@ -325,7 +337,7 @@ void Internal::Worker::recursiveSearch(QString const & path)
         {
             QMutexLocker l(&mLock);
             if (mDoCancel)
-                break;
+                return;
         }
 
         // Check for the file name to match the include filter and not the exclude filter
@@ -355,6 +367,13 @@ void Internal::Worker::recursiveSearch(QString const & path)
             QByteArray buf;
             while (!f.atEnd() && (includeFilterMatched <= 0 || excludeFilterMatched <= 0)) {
 
+                // Check for the cancel flag
+                {
+                    QMutexLocker l(&mLock);
+                    if (mDoCancel)
+                        return;
+                }
+
                 /* We read ReadBufferSize bytes from the file and append to the buffer.
                  * We keep max 2 x ReadBufferSize bytes in the buffer and throw away the oldest
                  * ReadBufferSize bytes of data. Every block is checked twice, but we make sure that
@@ -388,7 +407,7 @@ void Internal::Worker::recursiveSearch(QString const & path)
             {
                 QMutexLocker l(&mLock);
                 if (mDoCancel)
-                    break;
+                    return;
             }
 
             recursiveSearch(l + directory);