2012-02-24 30 views
2

我有一个顶级窗口名为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做到这一点,但仍然可以继续执行回调?

回答

0

真的需要隐藏窗口吗?我会做以下事情:首先,我打电话给gtk_set_sensitive()禁用窗口。

其次,我会创建一个带有两个单元格的VBox。在第一个单元格中,我将把你现在拥有的所有小部件放在一起。在第二个,我只是把一个标签的面板。该面板将被隐藏(这样,您的小部件将显示,因为他们现在只显示)。

在致电gtk_set_sensitive()之后,我会将小组件隐藏起来,并用标签显示面板,并显示“Processing ...”之类的内容。

也许这比解释它更容易;希望这可以帮助。

+1

感谢您的回复!只是我的主窗口在屏幕上占用了很多不动产,而我认为在线程处理时它可能看起来更好。感谢您使用“加工”标签的建议。我想过只是与进度条进行对话,但我认为在后台让应用程序紧缩数字并在用户完成后才通知用户,这是我为什么要隐藏所有内容的原因。但我不确定这是否可能,所以我最终可能不得不进入进度条路线。 – Tim 2012-02-24 21:00:37

0

当隐藏窗口时,回调停止执行肯定不是真的。一定有其他事情出错了。你读过关于在GTK中使用线程的所有requisite information吗?