From 64267e90e21f87c870ff1821588b3ef7cf7e0ffb Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 14 Oct 2026 01:58:06 +0800 Subject: [PATCH] Fix multi-device task list using a deleted network agent after plug-in reload --- src/slic3r/GUI/GUI_App.cpp | 5 +++++ src/slic3r/GUI/TaskManager.cpp | 17 ++++++++++++----- src/slic3r/GUI/TaskManager.hpp | 6 +++++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index ea039f99f0..660f85c719 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4020,6 +4020,11 @@ bool GUI_App::on_init_network(bool try_backup) else m_user_manager->set_agent(m_agent); + // A hot reload deletes the agent the task manager was built with. It lives until restart, so repoint it + // even if multi-device has since been turned off. + if (m_task_manager) + m_task_manager->set_agent(m_agent); + if (this->is_enable_multi_machine()) { if (!m_task_manager) { m_task_manager = new Slic3r::TaskManager(m_agent); diff --git a/src/slic3r/GUI/TaskManager.cpp b/src/slic3r/GUI/TaskManager.cpp index 712bfea67e..54efafe8ae 100644 --- a/src/slic3r/GUI/TaskManager.cpp +++ b/src/slic3r/GUI/TaskManager.cpp @@ -171,6 +171,11 @@ TaskManager::TaskManager(NetworkAgent* agent) ; } +void TaskManager::set_agent(NetworkAgent* agent) +{ + m_agent = agent; +} + int TaskManager::start_print(const std::vector& params, TaskSettings* settings) { @@ -240,17 +245,18 @@ int TaskManager::schedule(TaskStateInfo* task) fire_lifecycle_event(LifecycleEvent::PrintJobStarted, start_ctx); int result = -1; - if (!m_agent) { + NetworkAgent* agent = m_agent; + if (!agent) { BOOST_LOG_TRIVIAL(trace) << "task_manager: NetworkAgent is nullptr"; } else { - assert(m_agent); + assert(agent); try { // DEBUG FOR TEST #if 0 result = start_print_test(task->get_params(), task->update_status_fn, task->cancel_fn, task->wait_fn); #else - result = m_agent->start_print(task->get_params(), task->update_status_fn, task->cancel_fn, task->wait_fn); + result = agent->start_print(task->get_params(), task->update_status_fn, task->cancel_fn, task->wait_fn); #endif } catch (const std::exception& ex) { BOOST_LOG_TRIVIAL(error) << "task_manager: start_print threw: " << ex.what(); @@ -363,12 +369,13 @@ std::map TaskManager::get_local_task_list() std::map TaskManager::get_task_list(int curr_page, int page_count, int& total) { std::map out; - if (m_agent) { + NetworkAgent* agent = m_agent; + if (agent) { TaskQueryParams task_query_params; task_query_params.limit = page_count; task_query_params.offset = curr_page * page_count; std::string task_info; - int result = m_agent->get_user_tasks(task_query_params, &task_info); + int result = agent->get_user_tasks(task_query_params, &task_info); BOOST_LOG_TRIVIAL(trace) << "task_manager: get_task_list task_info=" << task_info; if (result == 0) { try { diff --git a/src/slic3r/GUI/TaskManager.hpp b/src/slic3r/GUI/TaskManager.hpp index 0f9686294d..66de945075 100644 --- a/src/slic3r/GUI/TaskManager.hpp +++ b/src/slic3r/GUI/TaskManager.hpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -158,6 +159,8 @@ public: static int SendingInterval; TaskManager(NetworkAgent* agent); + void set_agent(NetworkAgent* agent); + int start_print(const std::vector& params, TaskSettings* settings = nullptr); static void set_max_send_at_same_time(int count); @@ -184,7 +187,8 @@ private: std::vector m_sending_thread_list; std::mutex m_scedule_mutex; bool m_started { false }; - NetworkAgent* m_agent { nullptr }; + // Replaced on the main thread whenever networking is re-initialised, read by the sending threads. + std::atomic m_agent { nullptr }; std::chrono::system_clock::time_point last_sent_timestamp; };