UI操作 解决方案

  1 #include <iostream>                                                                                                                                                                                                          
  2 #include <deque>                                                                                                                                                                                                             
  3 #include <mutex>                                                                                                                                                                                                             
  4 #include <future>                                                                                                                                                                                                            
  5 #include <thread>                                                                                                                                                                                                            
  6 #include <utility>                                                                                                                                                                                                           
  7                                                                                                                                                                                                                              
  8                                                                                                                                                                                                                              
  9 std::mutex m;                                                                                                                                                                                                                
 10 std::deque<std::packaged_task<void()> > tasks;                                                                                                                                                                               
 11                                                                                                                                                                                                                              
 12 bool gui_shutdown_message_received();                                                                                                                                                                                        
 13 void get_and_process_gui_message();                                                                                                                                                                                          
 14                                                                                                                                                                                                                              
 15 void gui_thread()                                                                                                                                                                                                            
 16 {                                                                                                                                                                                                                            
 17     while(!gui_shutdown_message_received())                                                                                                                                                                                  
 18     {                                                                                                                                                                                                                        
 19         get_and_process_gui_message();                                                                                                                                                                                       
 20         std::packaged_task<void()> task;                                                                                                                                                                                     
 21         {                                                                                                                                                                                                                    
 22             std::lock_guard<std::mutex> lk(m);                                                                                                                                                                               
 23             if(tasks.empty())                                                                                                                                                                                                
 24                 continue;                                                                                                                                                                                                    
 25                                                                                                                                                                                                                              
 26             task = std::move(tasks.front());                                                                                                                                                                                 
 27             tasks.pop_front();                                                                                                                                                                                               
 28         }                                                                                                                                                                                                                    
 29         task();                                                                                                                                                                                                              
 30     }                                                                                                                                                                                                                        
 31 }                                                                                                                                                                                                                            
 32                                                                                                                                                                                                                              
 33 std::thread gui_bg_thread(gui_thread);                                                                                                                                                                                       
 34                                                                                                                                                                                                                              
 35 template<typename Func>                                                                                                                                                                                                      
 36 std::future<void> post_task_for_gui_thread(Func f)                                                                                                                                                                           
 37 {                                                                                                                                                                                                                            
 38     std::packaged_task<void()> task(f);                                                                                                                                                                                      
 39     std::future<void> res = task.get_future();                                                                                                                                                                               
 40     std::lock_guard<std::mutex> lk(m);                                                                                                                                                                                       
 41     tasks.push_back(std::move(task));                                                                                                                                                                                        
 42     return res;                                                                                                                                                                                                              
 43 }                                                                                                                                                                                                                            
 44                                                                                                                                                                                                                              
 45                                                                                                                                                                                                                              
 46 int main(int argc,char** argv)                                                                                                                                                                                               
 47 {                                                                                                                                                                                                                            
 48     std::cout << "-------------------------------------------------------" << std::endl;                                                                                                                                     
 49                                                                                                                                                                                                                              
 50     return 0;                                                                                                                                                                                                                
 51 }                                                                                                                                                                                                                                                           
~            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值