C++ 单独线程中的MessageDialog

C++ 单独线程中的MessageDialog,c++,multithreading,gtkmm,C++,Multithreading,Gtkmm,在我当前的项目中,我需要在按下特定按钮时执行一些计算,并且在执行这些计算时,我希望显示一个Gtk::Message对话框,该对话框仅说明正在执行计算。因此,我暂时像这样初始化MessageDialog,忽略我实际上不需要这里的指针: Gtk::MessageDialog *waitdialog; Gtk::MessageDialog dia("Processing", false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE, true); dia.set_titl

在我当前的项目中,我需要在按下特定按钮时执行一些计算,并且在执行这些计算时,我希望显示一个Gtk::Message对话框,该对话框仅说明正在执行计算。因此,我暂时像这样初始化MessageDialog,忽略我实际上不需要这里的指针:

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;
接下来,我想使用对话框启动一个单独的线程:

std::thread dialog_thread(wait_dialog,waitdialog);
wait_dialog方法定义如下:

void wait_dialog(Gtk::MessageDialog *dialog){
  dialog->run();
}
现在的问题是,即使主窗口因set_transient_for而变暗,消息对话框也不可见。但是,当我不启动一个单独的线程,而是调用waitdialog->run时,这将正确显示对话框,但会导致循环

所以,问题是:为什么使用单独线程的变通方法不起作用?我无法理解这一点:-

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

// 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;
}

是否允许在主线程之外显示UI?你希望通过这种方式实现什么?线程中的模式对话框只会阻塞该线程。是否要阻止该线程并让主线程保持响应?当我将按钮与计算连接时,ui会冻结,这是一个坏主意,因为用户可能会觉得程序已损坏。我的想法是打开一个没有按钮的MessageDialog,这只是说明程序正在进行一些计算,并在计算完成后释放MessageDialog。我无法在主线程中打开MessageDialog,因为它被阻止,我无法进行计算,所以我想把它放在它自己的线程中…我现在的解决方案是另一种方式:将计算放在它自己的线程中,让主线程被阻止。。。然而,我觉得我应该寻找更好的解决方案,因为我仍然需要将对话框传递给计算线程,以便在稍后将其释放……这听起来一点也不正确。不要阻塞主线程。它是用于用户界面的。把长时间运行的东西放在不同的线程中。谢谢:-你的回答让我在理论上更清楚了,尽管我仍然需要尝试以这种方式实现它。现在有点晚了,所以我明天会试试,但我已经领先了一大步…:-