2012-02-24 79 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嗎?