Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [gtk+ 2.10] Закрытие основного окна , окно закрывается, но процесс висит 
V
    Опции темы
nawok78
Дата 13.3.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.3.2008

Репутация: нет
Всего: нет



Итак. 
после открытия основного окна 
Код

  windowMain_create ();
  gtk_widget_show (windowMain);
  g_signal_connect ((gpointer) windowMain, "destroy", G_CALLBACK(gtk_main_quit),
                    NULL);


вызывается диалог логина с кнопками "Вход" и "Выход"
Код

void
on_windowMain_show                     (GtkWidget       *widget,
                                        gpointer         user_data)
{
  on_toExit_activate(NULL, NULL);
}


по нажатию "Вход" осуществляется проверка логин/пароля и вход в порграмму
иначе закрвается не только диалог, но и основное окно
Код

void
on_toExit_activate                     (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  dialogLogin_create();
  gint result = dialogLogin_run();
  dialogLogin_destroy();
  if (result!=GTK_RESPONSE_OK)
    windowMain_destroy();
}


Однако хотя окно и закрывается порцесс остается в памяти...
Код

void windowMain_destroy (void)
{
//  gtk_signal_emit_by_name (GTK_OBJECT(windowMain),"destroy");
  gtk_widget_destroy(windowMain);   
  windowMain=NULL;
}


здесь закоментирована попытка послать окну сообщение - не прокатила
ПОЧЕМУ? как с этим бороться?

при нажатии "Х" на главном окне - закрывается как надо 
Код

void windowMain_destroy (void)
{
//  gtk_signal_emit_by_name (GTK_OBJECT(windowMain),"destroy");
  gtk_main_quit();
  gtk_widget_destroy(windowMain);   
  gtk_main_quit();
  windowMain=NULL;
  gtk_main_quit();
}
  даже 3 gtk_main_quit не помогли!!!

путем эксперимента выявлено, что
Код

g_signal_connect ((gpointer) windowMain, "destroy", G_CALLBACK(gtk_main_quit),NULL);

необходимое условие "чистого" выхода из программы
достаточным является нажатие "X" на окне
КАК ИМИТИРОВАТЬ ЕГО НАЖАТИЕ???? 

проблемма действительно в том что , 
что войдя в цикл он не может выйти gtk_main_quit() не срабатывает
------------------------------
исходники прилагаются

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  noDOSgtk.zip 40,22 Kb
PM MAIL   Вверх
JackYF
Дата 13.3.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(nawok78 @  13.3.2008,  08:26 Найти цитируемый пост)
что войдя в цикл он не может выйти gtk_main_quit() не срабатывает

нет ли в gtk аналога Qt-шного QueuedConnection? То есть при g_signal_connect как-то указать, что вызов производится не сразу, а отложенно? это может помочь...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
nawok78
Дата 17.3.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.3.2008

Репутация: нет
Всего: нет



тут дело не в этом....
Код

  windowMain_create ();
  gtk_widget_show (windowMain);
  g_signal_connect ((gpointer) windowMain, "destroy", G_CALLBACK(gtk_main_quit),
                    NULL);
// раньше я на эту строку внимания не обращал:
  gtk_main();

так вот после всех телодвижений при вызове окна "Логин"
запускается этот цикл smile а gtk_main_quit УЖЕ отработала впустую 
теперь борюсь с этим

Ура!!! Вот так решается этот геморрой!!!
Код
int
main (int argc, char *argv[])
{
//...
  windowMain_create ();
  dialogLogin_create();
  gint result = dialogLogin_run();
  dialogLogin_destroy();
  if (result!=GTK_RESPONSE_OK)
  {
    windowMain_destroy();
  }
  else
    gtk_main ();
//...
}

Код
void windowMain_create (void)
{
  _windowMain.window = create_windowMain ();
  gtk_widget_show (_windowMain.window);
  g_signal_connect ((gpointer) _windowMain.window, "destroy", G_CALLBACK(gtk_main_quit),
                    NULL);
//  widget=lookup_widget(windowMain, "toExit")
}

void windowMain_destroy (void)
{
  gtk_object_destroy(GTK_OBJECT(_windowMain.window));   
  _windowMain.window=NULL;
}

Код
void
on_windowMain_show                     (GtkWidget       *widget,
                                        gpointer         user_data)
{
}
void
on_toExit_activate                     (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  dialogLogin_create();
  gint result = dialogLogin_run();
  dialogLogin_destroy();
  if (result!=GTK_RESPONSE_OK)
  {
    windowMain_destroy();
  }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1405 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.