我有一个 gtkmm 应用程序,我正在尝试将一些长时间运行的任务放入单独的线程中,这样它们就不会锁定 GUI。这是我的设计基于的教程:
http://www.velvetcache.org/2008/09/30/gtkmmglibmm-thread-example
当工作完成或需要更新某些内容时,我使用 Glib::Dispatcher 信号通知 GUI 线程,但是我不确定如何在工作线程和 GUI 线程之间传递数据。到目前为止,我一直在传递一个指向创建工人的类的指针,然后修改该类的公共成员,但有些事情告诉我这样做不是最正确的。这是一个例子:
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();
}
}
这本质上是可行的,但我想如果 GUI 线程想同时修改 thread_message 会有问题吗?只要我确定变量仅由单个线程修改还是有更好的方法,这样做是否安全?