我有一个GTK应用程序,其顶级窗口名为main_window
,标有Update
的按钮。单击Update
时,将执行回调。在回调中,我想隐藏main_window并启动一个新线程来做一些非常长的处理。问题是,当我使用gtk_widget_hide()时,“main_window”被取消映射(我认为),并且回调停止执行。这是我的回调:
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做到这一点,但仍然有回调继续执行?
答案 0 :(得分:0)
真的需要隐藏窗户吗?我会执行以下操作:首先,我通过调用gtk_set_sensitive()
禁用该窗口。
其次,我会创建一个包含两个单元格的VBox
。在第一个单元格中,我会放置您现在拥有的所有小部件。在第二个中,我只是放了一个带标签的面板。该面板将被隐藏(这样,您的小部件将显示为刚刚显示的那些)。
在调用gtk_set_sensitive()
后,我会使用您的小部件隐藏面板,并向面板显示标签,说“处理......”。
也许比解释它更容易;希望这有帮助。
答案 1 :(得分:0)
当隐藏窗口时,回调停止执行肯定不是真的。肯定会出现其他问题。您是否阅读了有关使用GTK线程的所有requisite information?
答案 2 :(得分:0)
尝试gtk_window_move(),不同但效果相同。
http://developer.gnome.org/gtk/2.24/GtkWindow.html#gtk-window-move