如何在执行回调时隐藏顶级GTK窗口

时间:2012-02-24 20:02:46

标签: c++ c gtk boost-thread

我有一个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做到这一点,但仍然有回调继续执行?

3 个答案:

答案 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