#include #include #include #include #include #include #include #include #include using namespace std::chrono_literals; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int count = 0; // This should be the number of files that have to be deleted. // A timer to send a delete update every 300ms. QTimer demo; demo.setInterval(300ms); // You should connect this to DeleteJobPrivate::slotReport, but take special care in updating the class variables: // - m_processedFiles // - m_totalFilesDirs // Otherwise the progress will be wrong. QObject::connect(&demo, &QTimer::timeout, [&count]() { qDebug() << QTime::currentTime() << QString(" No. of files deleted: %1").arg(count); }); demo.start(); // We need a temporary eventloop to keep the calling application alive while removing files. QEventLoop loop; // Note: Do pass in a list of files to delete as one of the lambda captures. // Also pass in: // - m_processedFiles // - m_totalFilesDirs // and update accordingly. auto deleteResult = std::async(std::launch::async, [&loop, &count]() { // Everything in this scope runs off-main-thread. Make it as expensive as you want. // Iterate over the files/folders... while (count < 100) { // ... and delete them here. std::this_thread::sleep_for(50ms); count++; } // Quit the eventloop instance, this unblocks the function that called exec on that loop object. loop.quit(); // Return whatever the result was. Should be checked in the parent function. return true; }); // This blocks the function at _this_ point till quit() is called on the loop. loop.exec(); // We get here if quit() was called. Get the value from the std::async return (the bool of the delete call) // And do whatever checks you want. if (deleteResult.get()) { qDebug() << "All files have been removed!"; } else { qDebug() << "Delete failed? Permission denied?"; } demo.stop(); return a.exec(); }