В моем графическом интерфейсе у меня есть главное окно списка магазинов.Когда пользователь дважды щелкает строку, появляется диалоговое окно.Проблема в том, что для заполнения данных, которые я заполняю в диалоговом окне, требуется некоторое время, поэтому я запустил поток (используя потоки наддува) для выполнения расчетов в диалоговом окне.
In main:
.......
g_signal_connect (G_OBJECT (m_treeview), "row_activated", G_CALLBACK (m_row_activated),
(gpointer) main_window);
.......
In m_row_activated:
.........
// combo_box and dialog are GtkWidget* global variables
create_dialog(dialog, combo_box); // function creates the combobox
set_combo_box_with_loading_message;
gtk_widget_show_all (dialog);
thread m_thread (bind (&do_dialog_calculations, data1, data2, combobox));
.........
In do_dialog_calculations:
.........
// do_calculations takes about 15 seconds to complete
do_calculations(MyData data1, MyData data2, combobox);
gdk_threads_enter();
gtk_combo_box_append_text(...);
gdk_threads_leave()
Всеработает нормально (т. е. когда пользователь дважды щелкает строку, сразу же появляется всплывающее окно с сообщением о загрузке, и оно заполняется в конце концов, когда возвращается поток), но моя проблема заключается в том, что пользователь закрывает диалоговое окно до завершения do_calculations в do_dialog_calculations.Если диалоговое окно уничтожено, мой выпадающий список внутри него будет уничтожен, и мой вызов gtk_combo_box_append_text вызовет ошибку.
Я пытался проверить поле со списком перед его обновлением:
In do_dialog_calculations:
.........
do_calculations(MyData data1, MyData data2, combobox);
gdk_threads_enter();
if (GTK_IS_COMBO_BOX (combobox))
gtk_combo_box_append_text(...);
gdk_threads_leave()
, но это приводит к тупику при вызове GTK_IS_COMBO_BOX.Я думаю, что это потому, что GTK_IS_COMBO_BOX, вероятно, вызывает gdk_threads_enter ().Я также пробовал тестировать NULL
if (combobox == NULL)
, но это тоже не сработало.Любые предложения о том, как обойти эту проблему?
ОБНОВЛЕНИЕ: тупик в GTK_IS_COMBO_BOX возникает, только если я закрываю диалоговое окно сразу после его открытия (то есть до завершения do_calculations (). Если я просто оставлю диалог, онбудет в конечном итоге обновляться. Также, если я переключу проверку выпадающего списка перед тем, как написать вызов gdk_threads_enter ():
if (GTK_IS_COMBO_BOX (combobox)
{
gdk_threads_enter();
gtk_combo_box_append_text(...);
gdk_threads_leave();
}
Когда я уничтожаю диалоговое окно до выполнения этого кода, не возникает тупиковая ситуация. Однако я боюсь редкоговероятность того, что пользователь закроет диалоговое окно после завершения проверки GTK_IS_COMBO_BOX.
PS - я использую потоки, чтобы выполнить вычисления в моем диалоговом окне, потому что диалоговые окна не являются модальными, и я хочу, чтобы пользователь мог делать другиевещи с основным пользовательским интерфейсом, в то время как диалоговые окна заполняются.