- 论坛徽章:
- 24
|
C++11 里终于有了 std::thread 线程但是好像还是没有跨线程消息,也没有消息循环机制,试了试 std::thread 配合 gtkmm 的跨线程消息。
目前程序工作正常...
- #include <glibmm.h>
- #include <algorithm>
- #include <functional>
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <string>
- #include <unistd.h>
- #include <thread>
- #include <mutex>
- #include <condition_variable>
- class McvApp;
- class McvThread
- {
- public:
- McvThread() {};
- ~McvThread() {};
- protected:
- int num;
- Glib::Dispatcher signal_thread_work;
- Glib::Dispatcher signal_thread_exit;
- std::queue<std::string> str_queue_events;
- std::mutex m_mutex;
- std::condition_variable m_cond;
- std::thread *p_thread;
- void fun();
- public:
- void setup(McvApp *p_mapp);
- void get_str_event(std::string &str_event);
- void start();
- void m_join();
- };
- class McvApp : public sigc::trackable
- {
- public:
- McvApp()
- {
- main_loop = Glib::MainLoop::create();
- };
- ~McvApp() {};
- void run_main_loop();
- void on_thread_signal(McvThread *p_mcv_thread);
- void on_thread_exit(McvThread *p_mcv_thread);
- private:
- Glib::RefPtr<Glib::MainLoop> main_loop;
- };
- void McvThread::setup(McvApp *p_mapp)
- {
- num = 0;
- signal_thread_work.connect(sigc::bind<1>(sigc::mem_fun(*p_mapp, &McvApp::on_thread_signal), this));
- signal_thread_exit.connect(sigc::bind<1>(sigc::mem_fun(*p_mapp, &McvApp::on_thread_exit), this));
- }
- void McvThread::start()
- {
- p_thread = new std::thread(&McvThread::fun, this);
- }
- void McvThread::m_join()
- {
- p_thread->join();
- }
- void McvThread::fun()
- {
- for (int i=0; i<200; i++)
- {
- //for (int i=0; i<10; i++) usleep(100*1000);
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
- num++;
- char ch_text[1024];
- std::string str_text;
- std::unique_lock<std::mutex> lock(m_mutex);
- if (str_queue_events.size() > 0) m_cond.wait(lock);
- snprintf(ch_text, 1000, "McvThread num : %d ", num);
- str_text = ch_text;
- snprintf(ch_text, 1000, "queue_events.size : %d ", str_queue_events.size());
- str_text += ch_text;
- str_queue_events.push(str_text);
- lock.unlock();
- signal_thread_work();
- }
- signal_thread_exit();
- }
- void McvThread::get_str_event(std::string &str_event)
- {
- std::unique_lock<std::mutex> lock(m_mutex);
- if (str_queue_events.size() > 0)
- {
- str_event = str_queue_events.front();
- str_queue_events.pop();
- }
- lock.unlock();
- m_cond.notify_one();
- }
- void McvApp::run_main_loop()
- {
- main_loop->run();
- }
- void McvApp::on_thread_signal(McvThread *p_mcv_thread)
- {
- std::string str_event = "";
- p_mcv_thread->get_str_event(str_event);
- std::cout << str_event << std::endl;
- }
- void McvApp::on_thread_exit(McvThread *p_mcv_thread)
- {
- p_mcv_thread->m_join();
- main_loop->quit();
- }
- int main(int, char**)
- {
- Glib::init();
- McvApp *p_app = new McvApp();
- McvThread *p_mcv_thread = new McvThread();
- p_mcv_thread->setup(p_app);
- p_mcv_thread->start();
- p_app->run_main_loop();
- std::cout << "main_loop quit. " << std::endl;
- return 0;
- }
复制代码 |
|