Browse Source
Merge pull request #11769 from liamwhite/qt-ownership-issue
qt: ensure worker cancellation is complete before clearing
pull/15/merge
liamwhite
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
11 additions and
6 deletions
-
src/yuzu/game_list.cpp
-
src/yuzu/game_list_worker.cpp
-
src/yuzu/game_list_worker.h
|
|
|
@ -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; |
|
|
|
}; |