Как скрыть окно GTK верхнего уровня при выполнении его обратного вызова - PullRequest
2 голосов
/ 25 февраля 2012

У меня есть приложение 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 голосов
/ 25 февраля 2012

Скорее всего, неверно, что ваш обратный вызов перестает выполняться, когда окно скрыто. Там должно быть что-то еще не так. Вы прочитали всю необходимую информацию об использовании потоков с GTK?

0 голосов
/ 29 февраля 2012

попробуйте gtk_window_move (), другой, но тот же эффект.

http://developer.gnome.org/gtk/2.24/GtkWindow.html#gtk-window-move

0 голосов
/ 25 февраля 2012

Действительно ли нужно прятать окно?Я бы сделал следующее: во-первых, я бы отключил окно, вызвав gtk_set_sensitive().

Во-вторых, я бы создал VBox с двумя ячейками.В первую ячейку я бы поместил все виджеты, которые у вас есть сейчас.Во втором я бы просто поместил панель с надписью.Панель будет скрыта (таким образом, ваши виджеты будут отображаться так, как они только что показаны).

После вызова gtk_set_sensitive() я бы скрыл панель с вашими виджетами и отобразил панель сярлык, говорящий что-то вроде «Обрабатывается ...».

Может быть, это проще сделать, чем объяснить;надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...