From 89d3ea6c2f6b6a6d6e5ed096862033cd30fe3a6d Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 7 Jan 2026 15:43:11 +0800 Subject: [PATCH] fix thread not check join able and use it may be crash bug. --- src/slic3r/GUI/GUI.cpp | 4 ---- src/slic3r/GUI/GUI_App.cpp | 8 -------- src/slic3r/GUI/SSWCP.cpp | 41 ++++++++++++++++++++++++++++++++++++++ src/slic3r/GUI/SSWCP.hpp | 2 +- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 15ec58f924..6b338b5f03 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -497,10 +497,6 @@ void about() void login() { - //LoginDialog dlg; - //dlg.ShowModal(); - - // ZUserLogin dlg; SMUserLogin dlg; dlg.run(); } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b92533e3f5..7d395687e8 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4092,14 +4092,6 @@ void GUI_App::sm_request_user_logout() m_login_userinfo.set_user_login(false); } try { - //if (!sm_login_dlg) { - // sm_login_dlg = new SMUserLogin(true); - //} else { - // delete sm_login_dlg; - // sm_login_dlg = new SMUserLogin(true); - //} - //// sm_login_dlg->ShowModal(); - wxString region = wxString::FromUTF8(app_config->get_country_code()); std::string url = ""; if (region == "CN") { diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index 8a6d91f88d..70364b2ad5 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -644,6 +644,10 @@ void SSWCP_Instance::sw_GetActiveFile() if (iszip) { std::weak_ptr weak_self = shared_from_this(); + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([file_path, file_name, weak_self]() { auto self = weak_self.lock(); std::string zipname = generate_zip_path(file_path, file_name); @@ -766,6 +770,8 @@ void SSWCP_Instance::sw_GetFileStream() { auto targetname = SSWCP::get_display_filename(); std::weak_ptr weak_self = shared_from_this(); + if (m_work_thread.joinable()) + m_work_thread.join(); m_work_thread = std::thread([oriname, targetname, weak_self]() { auto self = weak_self.lock(); if (self) { @@ -784,6 +790,8 @@ void SSWCP_Instance::sw_GetFileStream() { } }); } else { + if (m_work_thread.joinable()) + m_work_thread.join(); m_work_thread = std::thread([file_path, weak_self]() { auto self = weak_self.lock(); if (self) { @@ -2703,6 +2711,9 @@ void SSWCP_MachineOption_Instance::sw_GetPrintZip() std::weak_ptr weak_self = shared_from_this(); + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([oriname, targetname, weak_self]() { auto self = weak_self.lock(); if (self) { @@ -3915,6 +3926,8 @@ void SSWCP_MachineConnect_Instance::sw_test_connect() { // 错误处理 finish_job(); } else { + if (m_work_thread.joinable()) + m_work_thread.join(); m_work_thread = std::thread([this, host] { wxString msg; bool res = host->test(msg); @@ -3967,6 +3980,10 @@ void SSWCP_MachineConnect_Instance::sw_disconnect() { std::string dev_id = m_param_data.count("dev_id") ? m_param_data["dev_id"] : ""; auto weak_self = std::weak_ptr(shared_from_this()); + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([weak_self, need_reload, dev_id](){ auto self = weak_self.lock(); @@ -4724,6 +4741,10 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_connect() std::weak_ptr weak_ptr = shared_from_this(); auto engine = get_current_engine(); + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([weak_ptr, engine]() { if (!weak_ptr.lock()) { return; @@ -4776,6 +4797,10 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_disconnect() std::weak_ptr weak_ptr = shared_from_this(); auto engine = get_current_engine(); + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([weak_ptr, engine]() { if (!weak_ptr.lock()) { return; @@ -4850,6 +4875,10 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_subscribe() std::weak_ptr weak_ptr = shared_from_this(); auto engine = get_current_engine(); + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([weak_ptr, engine, topic, qos]() { if (!weak_ptr.lock()) { return; @@ -4923,6 +4952,10 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_unsubscribe() { std::weak_ptr weak_ptr = shared_from_this(); auto engine = get_current_engine(); + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([weak_ptr, engine, topic]() { if (!weak_ptr.lock()) { return; @@ -5110,6 +5143,10 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_set_engine() } else { auto weak_self = std::weak_ptr(shared_from_this()); // 设置断联回调 + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([weak_self, host, connect_params, link_mode, id, userid, reload_device_view] { auto self = weak_self.lock(); wxString msg = ""; @@ -5583,6 +5620,10 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_publish() std::weak_ptr weak_ptr = shared_from_this(); auto engine = get_current_engine(); + + if (m_work_thread.joinable()) + m_work_thread.join(); + m_work_thread = std::thread([weak_ptr, engine, topic, payload, qos]() { if (!weak_ptr.lock()) { return; diff --git a/src/slic3r/GUI/SSWCP.hpp b/src/slic3r/GUI/SSWCP.hpp index 7963745995..19b8d89093 100644 --- a/src/slic3r/GUI/SSWCP.hpp +++ b/src/slic3r/GUI/SSWCP.hpp @@ -185,7 +185,7 @@ public: void update_filament_info(const json& objects, bool send_message = false); protected: - std::thread m_work_thread; // Worker thread + std::thread m_work_thread; // Worker thread public: std::string m_cmd; // Command to execute