首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单独线程中的MessageDialog

单独线程中的MessageDialog
EN

Stack Overflow用户
提问于 2014-06-24 20:41:01
回答 1查看 530关注 0票数 0

在我当前的项目中,当一个特定的按钮被按下时,我需要执行一些计算,当我执行这些计算时,我想要显示一个简单地声明正在执行计算的Gtk::MessageDialog。所以,我这样初始化MessageDialog (暂时忽略我实际上不需要这里的指针):

代码语言:javascript
复制
Gtk::MessageDialog *waitdialog;
Gtk::MessageDialog dia("Processing", false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE, true);
dia.set_title("Wait.");
dia.set_transient_for(*(Gtk::Window *)this);
waitdialog = &dia;

接下来,我想使用该对话框启动一个单独的线程:

代码语言:javascript
复制
std::thread dialog_thread(wait_dialog,waitdialog);

wait_dialog方法的定义如下:

代码语言:javascript
复制
void wait_dialog(Gtk::MessageDialog *dialog){
  dialog->run();
}

现在的问题是,即使主窗口变暗(由于set_transient_for),消息对话框也是不可见的。但是,当我没有启动单独的线程,而只是调用waitdialog->run()时,这将正确地显示对话框(但会导致循环)。

因此,问题是:为什么单独线程的变通方法不起作用?我不明白这是什么意思:

EN

回答 1

Stack Overflow用户

发布于 2014-06-26 01:09:13

GUI组件需要留在GUI循环中。您的长时间运行的计算属于线程。然后,计算线程向GUI线程发回信号以关闭模式对话框。另外,您应该使用glib线程,而不是std::threads。下面是我构建程序的方式:

代码语言:javascript
复制
// in header, member var dispatcher used to signal GUI thread
// and our member var thread
Glib::Dispatcher m_signalDone;
Glib::Thread* m_someThread;

...

// in constructor, hook up dispatcher event
m_signalDone.connect(sigc::mem_fun(this, &MyClass::OnDone));

...

// later when ready to kick off thread...
// show dialog or progess bar or something and kick off thread...
m_someThread = Glib::Thread::create(sigc::mem_fun(*this, &MyClass::CalcMethod), true);

...

void MyClass::CalcMethod()
{
   // do your long running stuff...

   // when done signal completion back to GUI
   m_signalDone.emit();
}

...

void MyClass::OnDone()
{
    // clean up dialog or progress bar or whatever

    // kill thread
    m_currentBackUpThread->join();
    m_currentBackUpThread = NULL;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24386912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档