我有一个顶级窗口名为main_window
的GTK应用程序和一个名为Update
的按钮。当点击Update
时,执行回调。在回调中,我想隐藏main_window并启动一个新线程来执行一些非常长的处理。问题是,当我使用gtk_widget_hide()时,“main_window”被取消映射(我认为),并且回调停止执行。这里是我的回调:如何在执行回调时隐藏顶层GTK窗口
void update_button_clicked (GtkButton* update,
GtkWidget* main_window)
{
int retval = 2;
gtk_widget_hide (main_window); // Hide the main window
thread m_thread (bind (&update_thread, &retval));
int status = retval;
while (status != 0 && status != 1) {
gtk_main_iteration();
boost::mutex::scoped_lock lock (mut);
{
status = retval;
}
}
if (status) // Thread succeeded
{
show_succeeded_dialog();
gtk_main_quit();
} else { // Thread failed
show_failed_dialog();
// Do error handling
}
}
我的主题:
void update_thread (int *retval)
{
int status = do_long_work();
boost::mutex::scoped_lock lock (mut);
{
*retval = status;
}
}
一旦main_window
是隐藏的,在while
循环在我的回调停止执行和应用程序挂起。但是,如果我拨打gtk_widget_hide (main_window);
的电话,一切都按预期工作。我真的很想隐藏窗口,因为线程处理需要很长时间才能完成。有没有什么办法可以用GTK做到这一点,但仍然可以继续执行回调?
感谢您的回复!只是我的主窗口在屏幕上占用了很多不动产,而我认为在线程处理时它可能看起来更好。感谢您使用“加工”标签的建议。我想过只是与进度条进行对话,但我认为在后台让应用程序紧缩数字并在用户完成后才通知用户,这是我为什么要隐藏所有内容的原因。但我不确定这是否可能,所以我最终可能不得不进入进度条路线。 – Tim 2012-02-24 21:00:37