我有一个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