Merge pull request #11769 from liamwhite/qt-ownership-issue
qt: ensure worker cancellation is complete before clearing
This commit is contained in:
		| @@ -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_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 | ||||
|     item_model->removeRows(0, item_model->rowCount()); | ||||
|     search_field->clear(); | ||||
|  | ||||
|     emit ShouldCancelWorker(); | ||||
|  | ||||
|     GameListWorker* worker = | ||||
|         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, | ||||
|                                     GameListDir* parent_dir) { | ||||
|     const auto callback = [this, target, parent_dir](const std::filesystem::path& path) -> bool { | ||||
|         if (stop_processing) { | ||||
|         if (stop_requested) { | ||||
|             // Breaks the callback loop. | ||||
|             return false; | ||||
|         } | ||||
| @@ -399,7 +399,6 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa | ||||
| } | ||||
|  | ||||
| void GameListWorker::run() { | ||||
|     stop_processing = false; | ||||
|     provider->ClearAllEntries(); | ||||
|  | ||||
|     for (UISettings::GameDir& game_dir : game_dirs) { | ||||
| @@ -427,9 +426,11 @@ void GameListWorker::run() { | ||||
|     } | ||||
|  | ||||
|     emit Finished(watch_list); | ||||
|     processing_completed.Set(); | ||||
| } | ||||
|  | ||||
| void GameListWorker::Cancel() { | ||||
|     this->disconnect(); | ||||
|     stop_processing = true; | ||||
|     stop_requested.store(true); | ||||
|     processing_completed.Wait(); | ||||
| } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ | ||||
| #include <QRunnable> | ||||
| #include <QString> | ||||
|  | ||||
| #include "common/thread.h" | ||||
| #include "yuzu/compatibility_list.h" | ||||
| #include "yuzu/play_time_manager.h" | ||||
|  | ||||
| @@ -82,7 +83,9 @@ private: | ||||
|     const PlayTime::PlayTimeManager& play_time_manager; | ||||
|  | ||||
|     QStringList watch_list; | ||||
|     std::atomic_bool stop_processing; | ||||
|  | ||||
|     Common::Event processing_completed; | ||||
|     std::atomic_bool stop_requested = false; | ||||
|  | ||||
|     Core::System& system; | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 liamwhite
					liamwhite