我有一個gtkmm應用程序,我試圖把一些長時間運行的任務放到不同的線程中,這樣他們就不會鎖定GUI。這裏有一個教程,我根據我的設計:C++ Gtk線程。我做對了嗎?
http://www.velvetcache.org/2008/09/30/gtkmmglibmm-thread-example
我用油嘴::調度信號通知GUI線程,當工作完成或需要更新的東西,但我不知道如何在工作線程和GUI線程之間傳遞數據。到目前爲止,我一直在傳遞一個指向創建worker的類的指針,然後修改這個類的public成員,但是有些東西告訴我這不是最正確的做法。這裏有一個例子:
class Some_GUI_class
{
public:
std::string thread_message;
private:
Worker_class* worker;
void start_worker()
{
if (worker != NULL) return;
worker = new Worker_class(this);
worker->sig_message.connect(sigc::mem_fun(*this, &Some_GUI_class::display_message_from_thread);
worker.start();
}
void display_message_from_thread()
{
some_label->set_text(thread_message);
}
}
class Worker_class
{
public:
Worker_class(Some_GUI_class* gui_class) : gui_class(gui_class)
{}
void start()
{
thread = Glib::Thread::create(sigc::mem_fun(*this, &Worker_class::run), true);
}
Glib::Dispather sig_message;
protected:
Glib::Thread* thread;
Glib::Mutex mutex;
Some_GUI_class* gui_class;
void run()
{
// ...
gui_class->thread_message = "Message from a thread!";
sig_message();
}
}
這essentialy的作品,但我想如果GUI線程要同時修改thread_message會有問題嗎?這樣做是否安全?只要我確定變量只能由單個線程修改或者有更好的方法?
我不是gtk專家,但據我記得你有一個UI的消息循環,所以你需要在主線程中捕獲這些消息,然後觸發事件,它的棘手。 – 2012-04-26 15:14:29
@JakubOboza這是Glib :: Dispatcher所做的。 – ergosys 2012-04-26 21:46:14