免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1044 | 回复: 0
打印 上一主题 下一主题

[C++] C++11 std thread 和 gtkmm 的跨线程消息 [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-22 21:47 |只看该作者 |倒序浏览
          C++11  里终于有了 std::thread 线程但是好像还是没有跨线程消息,也没有消息循环机制,试了试 std::thread 配合 gtkmm 的跨线程消息。

          目前程序工作正常...  

  1. #include <glibmm.h>
  2. #include <algorithm>
  3. #include <functional>
  4. #include <iostream>
  5. #include <vector>
  6. #include <queue>
  7. #include <string>
  8. #include <unistd.h>
  9. #include <thread>
  10. #include <mutex>
  11. #include <condition_variable>

  12. class  McvApp;

  13. class  McvThread
  14. {
  15. public:
  16.     McvThread() {};
  17.     ~McvThread() {};

  18. protected:
  19.     int                         num;

  20.     Glib::Dispatcher            signal_thread_work;
  21.     Glib::Dispatcher            signal_thread_exit;

  22.     std::queue<std::string>     str_queue_events;
  23.     std::mutex                  m_mutex;
  24.     std::condition_variable     m_cond;

  25.     std::thread                *p_thread;

  26.     void  fun();

  27. public:
  28.     void setup(McvApp  *p_mapp);
  29.     void get_str_event(std::string  &str_event);
  30.     void start();
  31.     void m_join();
  32. };


  33. class McvApp : public sigc::trackable
  34. {
  35. public:
  36.     McvApp()
  37.     {
  38.         main_loop = Glib::MainLoop::create();
  39.     };
  40.     ~McvApp() {};
  41.     void run_main_loop();
  42.     void on_thread_signal(McvThread  *p_mcv_thread);
  43.     void on_thread_exit(McvThread  *p_mcv_thread);

  44. private:
  45.     Glib::RefPtr<Glib::MainLoop>  main_loop;
  46. };

  47. void McvThread::setup(McvApp  *p_mapp)
  48. {
  49.     num = 0;
  50.     signal_thread_work.connect(sigc::bind<1>(sigc::mem_fun(*p_mapp, &McvApp::on_thread_signal), this));
  51.     signal_thread_exit.connect(sigc::bind<1>(sigc::mem_fun(*p_mapp, &McvApp::on_thread_exit), this));
  52. }

  53. void McvThread::start()
  54. {
  55.       p_thread = new std::thread(&McvThread::fun, this);
  56. }

  57. void McvThread::m_join()
  58. {
  59.       p_thread->join();
  60. }

  61. void McvThread::fun()
  62. {
  63.     for (int i=0; i<200; i++)
  64.     {
  65.         //for (int i=0; i<10; i++) usleep(100*1000);

  66.         std::this_thread::sleep_for(std::chrono::milliseconds(100));

  67.         num++;

  68.         char           ch_text[1024];
  69.         std::string    str_text;

  70.         std::unique_lock<std::mutex> lock(m_mutex);

  71.         if (str_queue_events.size() > 0)  m_cond.wait(lock);

  72.         snprintf(ch_text, 1000, "McvThread num : %d    ", num);
  73.         str_text = ch_text;
  74.         snprintf(ch_text, 1000, "queue_events.size : %d    ", str_queue_events.size());
  75.         str_text += ch_text;
  76.         str_queue_events.push(str_text);

  77.         lock.unlock();

  78.         signal_thread_work();
  79.     }

  80.     signal_thread_exit();
  81. }

  82. void McvThread::get_str_event(std::string  &str_event)
  83. {
  84.     std::unique_lock<std::mutex> lock(m_mutex);

  85.     if (str_queue_events.size() > 0)
  86.     {
  87.         str_event = str_queue_events.front();
  88.         str_queue_events.pop();
  89.     }

  90.     lock.unlock();

  91.     m_cond.notify_one();
  92. }

  93. void McvApp::run_main_loop()
  94. {
  95.     main_loop->run();
  96. }

  97. void McvApp::on_thread_signal(McvThread  *p_mcv_thread)
  98. {
  99.     std::string  str_event = "";

  100.     p_mcv_thread->get_str_event(str_event);

  101.     std::cout << str_event << std::endl;
  102. }

  103. void McvApp::on_thread_exit(McvThread  *p_mcv_thread)
  104. {
  105.     p_mcv_thread->m_join();

  106.     main_loop->quit();
  107. }

  108. int main(int, char**)
  109. {
  110.     Glib::init();

  111.     McvApp *p_app = new McvApp();

  112.     McvThread    *p_mcv_thread = new McvThread();

  113.     p_mcv_thread->setup(p_app);
  114.     p_mcv_thread->start();

  115.     p_app->run_main_loop();

  116.     std::cout << "main_loop quit. " << std::endl;

  117.     return 0;
  118. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP