diff --git a/gui/checkthread.cpp b/gui/checkthread.cpp index e6fc23a0fd8..e83a2d09dd2 100644 --- a/gui/checkthread.cpp +++ b/gui/checkthread.cpp @@ -151,25 +151,27 @@ void CheckThread::run() return; } - QString file = mResult.getNextFile(); - while (!file.isEmpty() && mState == Running) { - qDebug() << "Checking file" << file; - cppcheck.check(FileWithDetails(file.toStdString(), Path::identify(file.toStdString(), mSettings.cppHeaderProbe), 0)); - runAddonsAndTools(mSettings, nullptr, file); - emit fileChecked(file); + const FileWithDetails* file = nullptr; + mResult.getNextFile(file); + while (file && mState == Running) { + const std::string& fname = file->spath(); + qDebug() << "Checking file" << QString::fromStdString(fname); + cppcheck.check(*file); + runAddonsAndTools(mSettings, nullptr, QString::fromStdString(fname)); + emit fileChecked(QString::fromStdString(fname)); if (mState == Running) - file = mResult.getNextFile(); + mResult.getNextFile(file); } const FileSettings* fileSettings = nullptr; mResult.getNextFileSettings(fileSettings); while (fileSettings && mState == Running) { - file = QString::fromStdString(fileSettings->filename()); - qDebug() << "Checking file" << file; + const std::string& fname = fileSettings->filename(); + qDebug() << "Checking file" << QString::fromStdString(fname); cppcheck.check(*fileSettings); - runAddonsAndTools(mSettings, fileSettings, QString::fromStdString(fileSettings->filename())); - emit fileChecked(file); + runAddonsAndTools(mSettings, fileSettings, QString::fromStdString(fname)); + emit fileChecked(QString::fromStdString(fname)); if (mState == Running) mResult.getNextFileSettings(fileSettings); diff --git a/gui/threadresult.cpp b/gui/threadresult.cpp index 008d201c42d..8300aeb41a7 100644 --- a/gui/threadresult.cpp +++ b/gui/threadresult.cpp @@ -58,14 +58,15 @@ void ThreadResult::reportErr(const ErrorMessage &msg) emit debugError(item); } -QString ThreadResult::getNextFile() +void ThreadResult::getNextFile(const FileWithDetails*& file) { std::lock_guard locker(mutex); - if (mFiles.isEmpty()) { - return QString(); + file = nullptr; + if (mItNextFile == mFiles.cend()) { + return; } - - return mFiles.takeFirst(); + file = &(*mItNextFile); + ++mItNextFile; } void ThreadResult::getNextFileSettings(const FileSettings*& fs) @@ -82,15 +83,20 @@ void ThreadResult::getNextFileSettings(const FileSettings*& fs) void ThreadResult::setFiles(const QStringList &files) { std::lock_guard locker(mutex); - mFiles = files; + std::list fdetails; + std::transform(files.cbegin(), files.cend(), std::back_inserter(fdetails), [](const QString& f) { + return FileWithDetails{f.toStdString(), Path::identify(f.toStdString(), false), static_cast(QFile(f).size())}; // TODO: provide Settings::cppHeaderProbe + }); + mFiles = std::move(fdetails); + mItNextFile = mFiles.cbegin(); mProgress = 0; mFilesChecked = 0; mTotalFiles = files.size(); // Determine the total size of all of the files to check, so that we can // show an accurate progress estimate - quint64 sizeOfFiles = std::accumulate(files.begin(), files.end(), 0, [](quint64 total, const QString& file) { - return total + QFile(file).size(); + quint64 sizeOfFiles = std::accumulate(mFiles.cbegin(), mFiles.cend(), 0, [](quint64 total, const FileWithDetails& file) { + return total + file.size(); }); mMaxProgress = sizeOfFiles; } diff --git a/gui/threadresult.h b/gui/threadresult.h index 8f291b01c77..33dc8290134 100644 --- a/gui/threadresult.h +++ b/gui/threadresult.h @@ -50,9 +50,8 @@ class ThreadResult : public QObject, public ErrorLogger { /** * @brief Get next unprocessed file - * @return File path */ - QString getNextFile(); + void getNextFile(const FileWithDetails*& file); void getNextFileSettings(const FileSettings*& fs); @@ -138,7 +137,8 @@ public slots: * @brief List of files to check * */ - QStringList mFiles; + std::list mFiles; + std::list::const_iterator mItNextFile; std::list mFileSettings; std::list::const_iterator mItNextFileSettings;