У меня есть приложение 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, но при этом коллбэк продолжает выполняться?