OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::TaskManager Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/TaskManager.hpp>

Collaboration diagram for Slic3r::TaskManager:

Public Member Functions

 TaskManager (NetworkAgent *agent)
void set_agent (NetworkAgent *agent)
int start_print (const std::vector< PrintParams > &params, TaskSettings *settings=nullptr)
void start ()
void stop ()
std::map< int, TaskStateInfo * > get_local_task_list ()
std::map< std::string, TaskStateInfo > get_task_list (int curr_page, int page_count, int &total)
TaskState query_task_state (std::string dev_id)

Static Public Member Functions

static void set_max_send_at_same_time (int count)

Static Public Attributes

static int MaxSendingAtSameTime = 5
static int SendingInterval = 180

Private Member Functions

int schedule (TaskStateInfo *task)

Private Attributes

boost::thread m_scedule_thread
std::vector< TaskGroup > m_cache_map
std::mutex m_map_mutex
std::vector< TaskStateInfo * > m_scedule_list
std::vector< boost::thread * > m_sending_thread_list
std::mutex m_scedule_mutex
bool m_started { false }
std::atomic< NetworkAgent * > m_agent { nullptr }
std::chrono::system_clock::time_point last_sent_timestamp

Detailed Description

Constructor & Destructor Documentation

◆ TaskManager()

Slic3r::TaskManager::TaskManager ( NetworkAgent * agent)
169 :m_agent(agent)
170{
171 ;
172}
std::atomic< NetworkAgent * > m_agent
Definition TaskManager.hpp:191

References m_agent.

Member Function Documentation

◆ get_local_task_list()

std::map< int, TaskStateInfo * > Slic3r::TaskManager::get_local_task_list ( )
351{
352 std::map<int, TaskStateInfo*> out;
353 m_map_mutex.lock();
354 for (auto it = m_cache_map.begin(); it != m_cache_map.end(); it++) {
355 for (auto iter = (*it).tasks.begin(); iter != (*it).tasks.end(); iter++) {
356 if ((*iter)->state() == TaskState::TS_PENDING
357 || (*iter)->state() == TaskState::TS_SENDING
358 || (*iter)->state() == TaskState::TS_SEND_CANCELED
359 || (*iter)->state() == TaskState::TS_SEND_COMPLETED
360 || (*iter)->state() == TaskState::TS_SEND_FAILED) {
361 out.insert(std::make_pair((*iter)->task_info_id, *iter));
362 }
363 }
364 }
365 m_map_mutex.unlock();
366 return out;
367}
std::mutex m_map_mutex
Definition TaskManager.hpp:184
std::vector< TaskGroup > m_cache_map
Definition TaskManager.hpp:183
@ TS_SEND_CANCELED
Definition TaskManager.hpp:30
@ TS_SEND_FAILED
Definition TaskManager.hpp:31
@ TS_SEND_COMPLETED
Definition TaskManager.hpp:29
@ TS_SENDING
Definition TaskManager.hpp:28
@ TS_PENDING
Definition TaskManager.hpp:27

References m_cache_map, m_map_mutex, Slic3r::TS_PENDING, Slic3r::TS_SEND_CANCELED, Slic3r::TS_SEND_COMPLETED, Slic3r::TS_SEND_FAILED, and Slic3r::TS_SENDING.

◆ get_task_list()

std::map< std::string, TaskStateInfo > Slic3r::TaskManager::get_task_list ( int curr_page,
int page_count,
int & total )
370{
371 std::map<std::string, TaskStateInfo> out;
372 NetworkAgent* agent = m_agent;
373 if (agent) {
374 TaskQueryParams task_query_params;
375 task_query_params.limit = page_count;
376 task_query_params.offset = curr_page * page_count;
377 std::string task_info;
378 int result = agent->get_user_tasks(task_query_params, &task_info, GUI::wxGetApp().get_printer_cloud_provider());
379 BOOST_LOG_TRIVIAL(trace) << "task_manager: get_task_list task_info=" << task_info;
380 if (result == 0) {
381 try {
382 json j = json::parse(task_info);
383 if (j.contains("total")) {
384 total = j["total"].get<int>();
385 }
386 if (!j.contains("hits")) {
387 return out;
388 }
389 BOOST_LOG_TRIVIAL(trace) << "task_manager: get_task_list task count =" << j["hits"].size();
390 for (auto& hit : j["hits"]) {
391 TaskStateInfo task_info;
392 int64_t design_id = 0;
393 if (hit.contains("designId")) {
394 design_id = hit["designId"].get<int64_t>();
395 }
396 if (design_id > 0 && hit.contains("designTitle")) {
397 task_info.set_task_name(hit["designTitle"].get<std::string>());
398 } else {
399 if (hit.contains("title"))
400 task_info.set_task_name(hit["title"].get<std::string>());
401 }
402 if (hit.contains("deviceName"))
403 task_info.set_device_name(hit["deviceName"].get<std::string>());
404 if (hit.contains("deviceId"))
405 task_info.params().dev_id = hit["deviceId"].get<std::string>();
406 if (hit.contains("id"))
407 task_info.set_job_id(std::to_string(hit["id"].get<int64_t>()));
408 if (hit.contains("status"))
409 task_info.set_state(parse_task_status(hit["status"].get<int>()));
410 if (hit.contains("cover"))
411 task_info.thumbnail_url = hit["cover"].get<std::string>();
412 if (hit.contains("startTime"))
413 task_info.start_time = hit["startTime"].get<std::string>();
414 if (hit.contains("endTime"))
415 task_info.end_time = hit["endTime"].get<std::string>();
416 if (hit.contains("profileId"))
417 task_info.profile_id = std::to_string(hit["profileId"].get<int64_t>());
418 if (!task_info.get_job_id().empty())
419 out.insert(std::make_pair(task_info.get_job_id(), task_info));
420 }
421 }
422 catch(...) {
423 }
424 }
425 }
426 return out;
427}
void trace(unsigned int level, const char *message)
Definition utils.cpp:247
TaskState parse_task_status(int status)
Definition TaskManager.cpp:61
nlohmann::json json
Definition AssembleList.cpp:42

References Slic3r::PrintParams::dev_id, Slic3r::TaskStateInfo::end_time, Slic3r::TaskStateInfo::get_job_id(), Slic3r::NetworkAgent::get_user_tasks(), Slic3r::TaskQueryParams::limit, m_agent, Slic3r::TaskQueryParams::offset, Slic3r::TaskStateInfo::params(), Slic3r::parse_task_status(), Slic3r::TaskStateInfo::profile_id, Slic3r::TaskStateInfo::set_device_name(), Slic3r::TaskStateInfo::set_job_id(), Slic3r::TaskStateInfo::set_state(), Slic3r::TaskStateInfo::set_task_name(), Slic3r::TaskStateInfo::start_time, Slic3r::TaskStateInfo::thumbnail_url, and Slic3r::trace().

Here is the call graph for this function:

◆ query_task_state()

TaskState Slic3r::TaskManager::query_task_state ( std::string dev_id)
430{
431 /* priority: TS_SENDING > TS_PENDING > TS_IDLE */
433 m_map_mutex.lock();
434 for (auto& task_group : m_cache_map) {
435 for (auto it = task_group.tasks.begin(); it != task_group.tasks.end(); it++) {
436 if ((*it)->params().dev_id == dev_id) {
437 if ((*it)->state() == TS_SENDING) {
438 m_map_mutex.unlock();
439 return TS_SENDING;
440 } else if ((*it)->state() == TS_PENDING) {
441 ts = TS_PENDING;
442 }
443 }
444 }
445 }
446 m_map_mutex.unlock();
447 return ts;
448}
TaskState
Definition TaskManager.hpp:26
@ TS_IDLE
Definition TaskManager.hpp:37

References m_cache_map, m_map_mutex, Slic3r::TS_IDLE, Slic3r::TS_PENDING, and Slic3r::TS_SENDING.

◆ schedule()

int Slic3r::TaskManager::schedule ( TaskStateInfo * task)
private
224{
225 if (!m_agent) {
226 assert(false);
227 return -1;
228 }
229 if (task->state() != TaskState::TS_PENDING)
230 return 0;
231 assert(task->state() == TaskState::TS_PENDING);
232 task->set_state(TaskState::TS_SENDING);
233
234 BOOST_LOG_TRIVIAL(trace) << "task_manager: schedule a task to dev_id = " << task->params().dev_id;
235 boost::thread* new_sending_thread = new boost::thread();
236 *new_sending_thread = Slic3r::create_thread(
237 [this, task] {
238 // Keep both lifecycle callbacks on this per-task worker thread. Plugin observers can
239 // therefore associate Started and Finished for one task with a single execution context.
240 LifecycleEventContext start_ctx;
241 start_ctx.name = task->params().project_name;
242 start_ctx.device_id = task->params().dev_id;
243 start_ctx.job_id = std::to_string(task->task_info_id);
244 start_ctx.source = "task_manager";
246
247 int result = -1;
248 NetworkAgent* agent = m_agent;
249 if (!agent) {
250 BOOST_LOG_TRIVIAL(trace) << "task_manager: NetworkAgent is nullptr";
251 }
252 else {
253 assert(agent);
254 try {
255// DEBUG FOR TEST
256#if 0
257 result = start_print_test(task->get_params(), task->update_status_fn, task->cancel_fn, task->wait_fn);
258#else
259 result = agent->start_print(task->get_params(), task->update_status_fn, task->cancel_fn, task->wait_fn);
260#endif
261 } catch (const std::exception& ex) {
262 BOOST_LOG_TRIVIAL(error) << "task_manager: start_print threw: " << ex.what();
263 } catch (...) {
264 BOOST_LOG_TRIVIAL(error) << "task_manager: start_print threw an unknown exception";
265 }
266 }
267 if (result == 0) {
268 last_sent_timestamp = std::chrono::system_clock::now();
269 task->set_sent_time(last_sent_timestamp);
270 task->set_state(TaskState::TS_SEND_COMPLETED);
271 }
272 else {
273 if (!task->is_canceled()) {
274 task->set_state(TaskState::TS_SEND_FAILED);
275 } else {
276 task->set_state(TaskState::TS_SEND_CANCELED);
277 }
278 }
279
280 LifecycleEventContext finish_ctx;
281 finish_ctx.name = task->params().project_name;
282 finish_ctx.device_id = task->params().dev_id;
283 finish_ctx.job_id = std::to_string(task->task_info_id);
284 finish_ctx.source = "task_manager";
285 finish_ctx.code = result == 0 ? LifecycleEvtCode::Ok :
286 (task->is_canceled() ? LifecycleEvtCode::Warn : LifecycleEvtCode::Error);
287 finish_ctx.msg = result == 0 ? "" : (task->is_canceled() ? "cancelled" : "failed");
289
290 /* remove from sending task list */
291 m_scedule_mutex.lock();
292 auto it = std::find(m_scedule_list.begin(), m_scedule_list.end(), task);
293 if (it != m_scedule_list.end()) {
294 BOOST_LOG_TRIVIAL(trace) << "task_manager: schedule, scedule task has removed from list";
295 m_scedule_list.erase(it);
296 }
297 else {
298 /*assert(false);*/
299 }
300 m_scedule_mutex.unlock();
301 }
302 );
303 m_sending_thread_list.push_back(new_sending_thread);
304 return 0;
305}
std::chrono::system_clock::time_point last_sent_timestamp
Definition TaskManager.hpp:193
std::mutex m_scedule_mutex
Definition TaskManager.hpp:188
std::vector< TaskStateInfo * > m_scedule_list
Definition TaskManager.hpp:186
std::vector< boost::thread * > m_sending_thread_list
Definition TaskManager.hpp:187
static int start_print_test(PrintParams &params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn)
Definition TaskManager.cpp:197
boost::thread create_thread(boost::thread::attributes &attrs, Fn &&fn)
Definition Thread.hpp:48
@ PrintJobFinished
Definition LifecycleEvents.hpp:61
@ PrintJobStarted
Definition LifecycleEvents.hpp:60
@ Warn
Definition LifecycleEvents.hpp:68
@ Error
Definition LifecycleEvents.hpp:68
@ Ok
Definition LifecycleEvents.hpp:68
void fire_lifecycle_event(LifecycleEvent event, const LifecycleEventContext &ctx)
Definition LifecycleEvents.hpp:234

References Slic3r::TaskStateInfo::cancel_fn, Slic3r::LifecycleEventContext::code, Slic3r::create_thread(), Slic3r::PrintParams::dev_id, Slic3r::LifecycleEventContext::device_id, Slic3r::Error, Slic3r::fire_lifecycle_event(), Slic3r::TaskStateInfo::get_params(), Slic3r::TaskStateInfo::is_canceled(), Slic3r::LifecycleEventContext::job_id, last_sent_timestamp, m_agent, m_scedule_list, m_scedule_mutex, m_sending_thread_list, Slic3r::LifecycleEventContext::msg, Slic3r::LifecycleEventContext::name, Slic3r::Ok, Slic3r::TaskStateInfo::params(), Slic3r::PrintJobFinished, Slic3r::PrintJobStarted, Slic3r::PrintParams::project_name, Slic3r::TaskStateInfo::set_sent_time(), Slic3r::TaskStateInfo::set_state(), Slic3r::LifecycleEventContext::source, Slic3r::NetworkAgent::start_print(), Slic3r::start_print_test(), Slic3r::TaskStateInfo::state(), Slic3r::TaskStateInfo::task_info_id, Slic3r::trace(), Slic3r::TS_PENDING, Slic3r::TS_SEND_CANCELED, Slic3r::TS_SEND_COMPLETED, Slic3r::TS_SEND_FAILED, Slic3r::TS_SENDING, Slic3r::TaskStateInfo::update_status_fn, Slic3r::TaskStateInfo::wait_fn, and Slic3r::Warn.

Referenced by start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_agent()

void Slic3r::TaskManager::set_agent ( NetworkAgent * agent)
175{
176 m_agent = agent;
177}

References m_agent.

◆ set_max_send_at_same_time()

void Slic3r::TaskManager::set_max_send_at_same_time ( int count)
static
164{
166}
static unsigned int count
Definition AuxiliaryDataViewModel.cpp:246
static int MaxSendingAtSameTime
Definition TaskManager.hpp:158

References count, and MaxSendingAtSameTime.

◆ start()

void Slic3r::TaskManager::start ( )
308{
309 if (m_started) {
310 return;
311 }
312 m_started = true;
314 [this] {
315 BOOST_LOG_TRIVIAL(trace) << "task_manager: thread start()";
316 while (m_started) {
317 m_map_mutex.lock();
318 for (auto it = m_cache_map.begin(); it != m_cache_map.end(); it++) {
319 for (auto iter = it->tasks.begin(); iter != it->tasks.end(); iter++) {
320 m_scedule_mutex.lock();
322 && it->need_schedule(last_sent_timestamp, *iter)) {
323 m_scedule_list.push_back(*iter);
324 }
325 m_scedule_mutex.unlock();
326 }
327 }
328 m_map_mutex.unlock();
329 if (!m_scedule_list.empty()) {
330 //BOOST_LOG_TRIVIAL(trace) << "task_manager: need scedule task count = " << m_scedule_list.size();
331 m_scedule_mutex.lock();
332 for (auto it = m_scedule_list.begin(); it != m_scedule_list.end(); it++) {
333 this->schedule(*it);
334 }
335 m_scedule_mutex.unlock();
336 }
337 boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
338 }
339 BOOST_LOG_TRIVIAL(trace) << "task_manager: thread exit()";
340 });
341}
bool m_started
Definition TaskManager.hpp:189
boost::thread m_scedule_thread
Definition TaskManager.hpp:181
int schedule(TaskStateInfo *task)
Definition TaskManager.cpp:223

References Slic3r::create_thread(), last_sent_timestamp, m_cache_map, m_map_mutex, m_scedule_list, m_scedule_mutex, m_scedule_thread, m_started, MaxSendingAtSameTime, schedule(), and Slic3r::trace().

Here is the call graph for this function:

◆ start_print()

int Slic3r::TaskManager::start_print ( const std::vector< PrintParams > & params,
TaskSettings * settings = nullptr )
181{
182 BOOST_LOG_TRIVIAL(info) << "task_manager: start_print size = " << params.size();
183 TaskManager::MaxSendingAtSameTime = settings->max_sending_at_same_time;
184 TaskManager::SendingInterval = settings->sending_interval;
185 m_map_mutex.lock();
186 TaskGroup task_group(*settings);
187 task_group.tasks.reserve(params.size());
188 for (auto it = params.begin(); it != params.end(); it++) {
189 TaskStateInfo* new_item = new TaskStateInfo(*it);
190 task_group.append(new_item);
191 }
192 m_cache_map.push_back(task_group);
193 m_map_mutex.unlock();
194 return 0;
195}
static int SendingInterval
Definition TaskManager.hpp:159

References Slic3r::TaskGroup::append(), m_cache_map, m_map_mutex, Slic3r::TaskSettings::max_sending_at_same_time, MaxSendingAtSameTime, Slic3r::TaskSettings::sending_interval, SendingInterval, and Slic3r::TaskGroup::tasks.

Here is the call graph for this function:

◆ stop()

void Slic3r::TaskManager::stop ( )
344{
345 m_started = false;
346 if (m_scedule_thread.joinable())
347 m_scedule_thread.join();
348}

References m_scedule_thread, and m_started.

Member Data Documentation

◆ last_sent_timestamp

std::chrono::system_clock::time_point Slic3r::TaskManager::last_sent_timestamp
private

Referenced by schedule(), and start().

◆ m_agent

std::atomic<NetworkAgent*> Slic3r::TaskManager::m_agent { nullptr }
private
191{ nullptr };

Referenced by TaskManager(), get_task_list(), schedule(), and set_agent().

◆ m_cache_map

std::vector<TaskGroup> Slic3r::TaskManager::m_cache_map
private

◆ m_map_mutex

std::mutex Slic3r::TaskManager::m_map_mutex
private

◆ m_scedule_list

std::vector<TaskStateInfo*> Slic3r::TaskManager::m_scedule_list
private

Referenced by schedule(), and start().

◆ m_scedule_mutex

std::mutex Slic3r::TaskManager::m_scedule_mutex
private

Referenced by schedule(), and start().

◆ m_scedule_thread

boost::thread Slic3r::TaskManager::m_scedule_thread
private

Referenced by start(), and stop().

◆ m_sending_thread_list

std::vector<boost::thread*> Slic3r::TaskManager::m_sending_thread_list
private

Referenced by schedule().

◆ m_started

bool Slic3r::TaskManager::m_started { false }
private
189{ false };

Referenced by start(), and stop().

◆ MaxSendingAtSameTime

int Slic3r::TaskManager::MaxSendingAtSameTime = 5
static

◆ SendingInterval

int Slic3r::TaskManager::SendingInterval = 180
static

The documentation for this class was generated from the following files: