我有一個頂級窗口名爲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