#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; }