#include #include #include #include #include std::mutex m; std::deque> tasks; bool gui_shutdown_message_received(); void get_and_process_gui_message(); void gui_thread() { while (!gui_shutdown_message_received()) { get_and_process_gui_message(); std::packaged_task task; { std::lock_guard lk(m); if (tasks.empty()) continue; task = std::move(tasks.front()); tasks.pop_front(); } task(); } } std::thread gui_bg_thread(gui_thread); template std::future post_task_for_gui_thread(Func f) { std::packaged_task task(f); std::future res = task.get_future(); std::lock_guard lk(m); tasks.push_back(std::move(task)); return res; }