diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index 3f9fb663f0..26f5679a8c 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -4,6 +4,8 @@ #include "DolphinQt/Settings.h" +#include + #include #include #include @@ -42,8 +44,21 @@ Settings::Settings() QueueOnObject(this, [this, new_state] { emit EmulationStateChanged(new_state); }); }); - Config::AddConfigChangedCallback( - [this] { QueueOnObject(this, [this] { emit ConfigChanged(); }); }); + Config::AddConfigChangedCallback([this] { + static std::atomic do_once{true}; + if (do_once.exchange(false)) + { + // Calling ConfigChanged() with a "delay" can have risks, for example, if from + // code we change some configs that result in Qt greying out some setting, we could + // end up editing that setting before its greyed out, sending out an event, + // which might not be expected or handled by the code, potentially crashing. + // The only safe option would be to wait on the Qt thread to have finished executing this. + QueueOnObject(this, [this] { + do_once = true; + emit ConfigChanged(); + }); + } + }); g_controller_interface.RegisterDevicesChangedCallback([this] { if (Host::GetInstance()->IsHostThread())