mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-12-26 19:32:40 -06:00
Merge pull request #11769 from liamwhite/qt-ownership-issue
qt: ensure worker cancellation is complete before clearing
This commit is contained in:
commit
1a4874e178
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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue