qt: ensure worker cancellation is complete before clearing

master
Liam 2023-10-12 21:07:49 +07:00
parent 519c12da15
commit faa6c35e78
3 changed files with 11 additions and 6 deletions

@ -826,12 +826,13 @@ void GameList::PopulateAsync(QVector<UISettings::GameDir>& game_dirs) {
tree_view->setColumnHidden(COLUMN_SIZE, !UISettings::values.show_size); tree_view->setColumnHidden(COLUMN_SIZE, !UISettings::values.show_size);
tree_view->setColumnHidden(COLUMN_PLAY_TIME, !UISettings::values.show_play_time); tree_view->setColumnHidden(COLUMN_PLAY_TIME, !UISettings::values.show_play_time);
// Before deleting rows, cancel the worker so that it is not using them
emit ShouldCancelWorker();
// Delete any rows that might already exist if we're repopulating // Delete any rows that might already exist if we're repopulating
item_model->removeRows(0, item_model->rowCount()); item_model->removeRows(0, item_model->rowCount());
search_field->clear(); search_field->clear();
emit ShouldCancelWorker();
GameListWorker* worker = GameListWorker* worker =
new GameListWorker(vfs, provider, game_dirs, compatibility_list, play_time_manager, system); new GameListWorker(vfs, provider, game_dirs, compatibility_list, play_time_manager, system);

@ -293,7 +293,7 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) {
void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_path, bool deep_scan, void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_path, bool deep_scan,
GameListDir* parent_dir) { GameListDir* parent_dir) {
const auto callback = [this, target, parent_dir](const std::filesystem::path& path) -> bool { const auto callback = [this, target, parent_dir](const std::filesystem::path& path) -> bool {
if (stop_processing) { if (stop_requested) {
// Breaks the callback loop. // Breaks the callback loop.
return false; return false;
} }
@ -399,7 +399,6 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa
} }
void GameListWorker::run() { void GameListWorker::run() {
stop_processing = false;
provider->ClearAllEntries(); provider->ClearAllEntries();
for (UISettings::GameDir& game_dir : game_dirs) { for (UISettings::GameDir& game_dir : game_dirs) {
@ -427,9 +426,11 @@ void GameListWorker::run() {
} }
emit Finished(watch_list); emit Finished(watch_list);
processing_completed.Set();
} }
void GameListWorker::Cancel() { void GameListWorker::Cancel() {
this->disconnect(); this->disconnect();
stop_processing = true; stop_requested.store(true);
processing_completed.Wait();
} }

@ -12,6 +12,7 @@
#include <QRunnable> #include <QRunnable>
#include <QString> #include <QString>
#include "common/thread.h"
#include "yuzu/compatibility_list.h" #include "yuzu/compatibility_list.h"
#include "yuzu/play_time_manager.h" #include "yuzu/play_time_manager.h"
@ -82,7 +83,9 @@ private:
const PlayTime::PlayTimeManager& play_time_manager; const PlayTime::PlayTimeManager& play_time_manager;
QStringList watch_list; QStringList watch_list;
std::atomic_bool stop_processing;
Common::Event processing_completed;
std::atomic_bool stop_requested = false;
Core::System& system; Core::System& system;
}; };