Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2012, 06:51   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос Mono: как программно закрыть окно

Имеется необходимость реализовать приложение, состоящее из n'ого количества форм, причем логика работы этих форм должна быть примерно следующей: из формы(окна) 1 открываются формы 1.1 или 1.2, из 1.1 открываются 1.1.1 или 1.1.2 и т.д. С открытием проблем нет, но как закрывать не нужные в данный момент окна? Во Framework, в VS необходимо было просто написать:
Код:
myForm.Close();
т.е. вызвать стандартный метод Close для необходимого окна, но в Gtk# для Gtk.Window такого метода попросту нет! Имеется метод Dispose[myForm.Dispose()], попробовал использовать его, но эффекта ровно ноль - форма ни только не закрылась, но и сохранила весь свой функционал.
Подскажите пожалуйста, каким все таки образом возможно закрыть окно в Gtk#?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 26.06.2012 в 06:55.
Mixim вне форума Ответить с цитированием
Старый 26.06.2012, 07:08   #2
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Только что нашел ЗДЕСЬ ответ:
Цитата:
Depends what you want to do:
gtk.main_quit() will totally kill the program
gtk.window.destroy() will destroy the window but keep the program running
gtk.window.hide() will hide the window so it can be opened again

replace gtk.window with the name of your actual window.
Иногда вообще не понимаю применяемую методологию разработчиков Gtk#: перевод destroy: 1)уничтожить, разрушить, уничтожать, разрушать, истребить, погубить, истреблять, губить, уничтожаться;
2)нарушить, разорить;
3)разрушаться;
4)разгромить.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 26.06.2012, 07:50   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Иногда вообще не понимаю применяемую методологию разработчиков Gtk#:
GTK# это порт библиотек gtk. Там свои заморочки. Касательно destroy - это стандартное именование методов уничтожения объекта (во многих языках и библиотеках). И close здесь как раз не очевидно и может внести путаницу - ведь закрытие не означает уничтожение, может быть оно просто становится невидимым? Или сворачивается? Используйте терминологию, которая бы однозначно определяла предполагаемые действия.
Также могу предполагать, что поскольку gtk написана на си, то использует стандартную ООП-модель - явно созданные объекты должны явно уничтожаться. В c# и ему подобных есть сборщик мусора, который может уничтожать объекты самостоятельно, поэтому использование деструкторов там не часто встречается. Close - устоявшаяся терминология для оконного интерфейса, в то время как Destroy это универсальный деструктор для любого объекта (не только элементов интерфейса).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 26.06.2012 в 08:02.
Utkin вне форума Ответить с цитированием
Старый 26.06.2012, 09:44   #4
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Благодарю, однако ради интереса решил проверить действительно ли освобождается память после выполнения:
Цитата:
Сообщение от Utkin Посмотреть сообщение
destroy - это стандартное именование методов уничтожения объекта (во многих языках и библиотеках)
Открываю Диспетчер задач, запускаю программу - её процесс занял 3.5Мб памяти, открываю дополнительное окно - плюс 300Кбайт, в этом окне нажимаю на кнопку, метод OnClick которой описан следующим образом:
Код:
			
protected void OnMyCloseButtonClicked (object sender, EventArgs e)
{				
	this.Destroy();
}
Если правильно понимаю, то окно должно закрыться, а память освободиться, но она ни только не освобождается, а куда-то еще уходят ~150Кбайт! Пробовал вызывать метод Destroy() в родительском окне(ради теста добавил в модуль с главным окном переменную класса MyWindow и кнопку DestroyMyWindow, в событие OnClicked которой прописал myWindow.Destroy()), но и эта технология память не чистит, точно также куда-то дополнительно расходуются 150Кбайт! Предполагается, что пользователь может хоть каждые 5 секунд открывать и закрывать окна, аналогичные MyWindow(в процессе развития проекта их количество может стать значительным), поэтому терять каждый раз по 450Кбайт - недопустимая роскошь. Думаю, что даже в .NET Framework GC(сборщик мусора) вряд ли бы сам справился с такой частой очисткой памяти, поэтому нужно чистить все вручную
Подумал, что память расходуется на какие-то другие операции, которые в отладчике я не вижу(код для которых написан\сгенерирован не мной, а самим Mono Developer), но открыв и закрыв раз 15 окно MyWindow и посмотрев сколько памяти выделено приложению на текущий момент(~10Мб), разубедился в этом.
Каким образом можно действительно освободить всю память, занятую не нужными(закрытыми) в данный момент окнами?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 26.06.2012 в 09:49.
Mixim вне форума Ответить с цитированием
Старый 26.06.2012, 11:00   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Если правильно понимаю
Неправильно понимаете. Сборщик мусора не обязан выделять ресурсы сразу как только они освободились - это нагружает систему. Он делает это тогда когда необходимо (ему, а не Вам) - например, при сильной фрагментации памяти.

Цитата:
Думаю, что даже в .NET Framework GC(сборщик мусора) вряд ли бы сам справился с такой частой очисткой памяти, поэтому нужно чистить все вручную
Зря Вы так думаете - там все путем иначе глюки уже давно дали бы о себе знать.

Цитата:
Каким образом можно действительно освободить всю память, занятую не нужными(закрытыми) в данный момент окнами?
Нет такого способа. Если память не требуется вот прям вот немедленно, то она не обязательно будет высвобождена.

Считайте что данный метод не принуждение к освобождению памяти, а информирование сборщика мусора о ненужном объекте. Не волнуйтесь, он принял к сведению
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 26.06.2012 в 13:48.
Utkin вне форума Ответить с цитированием
Старый 02.09.2012, 12:13   #6
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Не волнуйтесь, он принял к сведению
Спасибо, теперь буду знать.
Отступлю немного от темы: а каким образом мы может в приложении Gtk получить количество открытых в данный момент окон? Есть ли какие-нибудь аналоги System.Windows.Forms.Application.Op enForms.Count для Gtk Project?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как закрыть наглое активное окно? MotoArhangel Общие вопросы Delphi 8 09.03.2011 21:32
Закрыть всплывающее окно - как? fezilk25 Общие вопросы Delphi 4 17.11.2010 19:22
Программно закрыть окно AutoPlay Menu Builder KSN69 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 22.04.2010 13:48
Программно закрыть окно блокнота Crivel Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 02.04.2009 16:40
Как закрыть окно подключения к инету dial-up? Vladimir K. Работа с сетью в Delphi 4 12.02.2008 19:13