From 9500000adbd7e76ba7d2ca8e97b1dd730de03f1f Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Sun, 20 Oct 2024 18:41:18 +0200 Subject: [PATCH] use a jthread --- src/gui/input/InputAPIAddWindow.cpp | 38 ++++++++++++----------------- src/gui/input/InputAPIAddWindow.h | 8 +----- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/gui/input/InputAPIAddWindow.cpp b/src/gui/input/InputAPIAddWindow.cpp index 688ee14e..8783dd22 100644 --- a/src/gui/input/InputAPIAddWindow.cpp +++ b/src/gui/input/InputAPIAddWindow.cpp @@ -212,7 +212,7 @@ void InputAPIAddWindow::on_api_selected(wxCommandEvent& event) void InputAPIAddWindow::on_controller_dropdown(wxCommandEvent& event) { - if (m_search_running) + if (m_search_thread.joinable()) return; int selection = m_input_api->GetSelection(); @@ -238,38 +238,31 @@ void InputAPIAddWindow::on_controller_dropdown(wxCommandEvent& event) // TODO selected_uuid } - m_search_running = true; - wxWindowUpdateLocker lock(m_controller_list); m_controller_list->Clear(); m_controller_list->Append(_("Searching for controllers..."), (wxClientData*)nullptr); m_controller_list->SetSelection(wxNOT_FOUND); - m_search_thread_data = std::make_unique(); - std::thread([this, provider, selected_uuid](std::shared_ptr data) + m_search_thread = std::jthread([this, provider, selected_uuid](std::stop_token stopToken) { auto available_controllers = provider->get_controllers(); + if(!stopToken.stop_requested()) { - std::lock_guard lock{data->mutex}; - if(!data->discardResult) - { - wxCommandEvent event(wxControllersRefreshed); - event.SetEventObject(m_controller_list); - event.SetClientObject(new wxCustomData(std::move(available_controllers))); - event.SetInt(provider->api()); - event.SetString(selected_uuid); - wxPostEvent(this, event); - m_search_running = false; - } + wxCommandEvent event(wxControllersRefreshed); + event.SetEventObject(m_controller_list); + event.SetClientObject(new wxCustomData(std::move(available_controllers))); + event.SetInt(provider->api()); + event.SetString(selected_uuid); + wxPostEvent(this, event); } - }, m_search_thread_data).detach(); + }); } void InputAPIAddWindow::on_controller_selected(wxCommandEvent& event) { - if (m_search_running) + if (m_search_thread.joinable()) { return; } @@ -289,6 +282,7 @@ void InputAPIAddWindow::on_controller_selected(wxCommandEvent& event) void InputAPIAddWindow::on_controllers_refreshed(wxCommandEvent& event) { + m_search_thread = {}; const auto type = event.GetInt(); wxASSERT(0 <= type && type < InputAPI::MAX); @@ -317,10 +311,10 @@ void InputAPIAddWindow::on_controllers_refreshed(wxCommandEvent& event) void InputAPIAddWindow::discard_thread_result() { - m_search_running = false; - if(m_search_thread_data) + if(m_search_thread.joinable()) { - std::lock_guard lock{m_search_thread_data->mutex}; - m_search_thread_data->discardResult = true; + m_search_thread.request_stop(); + m_search_thread.detach(); + m_search_thread = {}; } } diff --git a/src/gui/input/InputAPIAddWindow.h b/src/gui/input/InputAPIAddWindow.h index 085dd623..807fe972 100644 --- a/src/gui/input/InputAPIAddWindow.h +++ b/src/gui/input/InputAPIAddWindow.h @@ -52,11 +52,5 @@ private: std::shared_ptr m_controller; std::vector m_controllers; - std::atomic_bool m_search_running = false; - struct AsyncThreadData - { - std::atomic_bool discardResult = false; - std::mutex mutex; - }; - std::shared_ptr m_search_thread_data; + std::jthread m_search_thread; };