在我当前的项目中,当一个特定的按钮被按下时,我需要执行一些计算,当我执行这些计算时,我想要显示一个简单地声明正在执行计算的Gtk::MessageDialog。所以,我这样初始化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()时,这将正确地显示对话框(但会导致循环)。
因此,问题是:为什么单独线程的变通方法不起作用?我不明白这是什么意思:
发布于 2014-06-26 01:09:13
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;
}https://stackoverflow.com/questions/24386912
复制相似问题