Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
1

Освобождаются ли ресурсы в данном случае

09.04.2012, 13:14. Просмотров 1231. Ответов 15
Метки нет (Все метки)


в событии нажатия кнопки из главной формы создается child форма так:

C#
1
2
3
4
5
6
yesNo wDialog = new yesNo();
            wDialog.ShowDialog();
            if (wDialog.answer == true)
           {
               MessageBox.Show("нажали ок");
           }
потом когда child форма закрывается методом close переменная в ней однако остается доступной.
получается, форма не уничтожилась хотя был выполнен метод close в child форме?
а если это событие многократно исполнять то что проихсодит? будет много форм в памяти одинаковых или нет?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2012, 13:14
Ответы с готовыми решениями:

Освобождаются ли ресурсы при создании скриншота экрана?
Всем привет, в интернете нашел исходник который позволяет делать скриншот экрана, но вот вопрос:...

Не освобождаются ресурсы после закрытия Activity
Очередная непонятная проблема. Делаю в активити setContentView() с большим количеством ImageView. В...

При выключении режима игры в редакторе не освобождаются ресурсы
Приветствую. При выключении режима игры в редакторе не освобождаются ресурсы. По событии...

что означает %k в данном случае?
#include <iostream> #include <conio.h> using namespace std; void main() { int i,j,k;...

15
Эксперт Java
4072 / 3806 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
09.04.2012, 13:33 2
Цитата Сообщение от Анарион Посмотреть сообщение
будет много форм в памяти одинаковых или нет?
Будет. Но они со временем уничтожатся сборщиком мусора.
1
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
09.04.2012, 13:39  [ТС] 3
а вот если у меня на панели несколько объектов. как мне их удалить с панели?
что то вроде panel1.clear() - есть?
0
23 / 23 / 7
Регистрация: 23.02.2012
Сообщений: 107
09.04.2012, 13:43 4
Анарион,попробуй
C#
1
panel1.Controls.Clear();
0
194 / 162 / 38
Регистрация: 21.10.2011
Сообщений: 178
09.04.2012, 13:44 5
Панель просто удалится с формы, но останется в памяти, пока по ней GC не пройдется.
C#
1
Controls.Remove(panel1);
Для удаления использовать Dispose();
0
Эксперт .NET
14836 / 11224 / 2946
Регистрация: 17.09.2011
Сообщений: 18,794
09.04.2012, 13:57 6
Цитата Сообщение от Анарион Посмотреть сообщение
получается, форма не уничтожилась хотя был выполнен метод close в child форме?
Нет, метод Close всего лишь скрывает из виду форму, открытую через ShowDialog. Сам объект остается в памяти.

Цитата Сообщение от Анарион Посмотреть сообщение
а если это событие многократно исполнять то что проихсодит? будет много форм в памяти одинаковых или нет?
Да, будут висеть в памяти, пока до них не доберется сборщик. А когда доберется, то GDI-дескрипторы, используемые формой, все равно не будут закрыты, т.к. они являются неуправляемым (и ограниченным!) ресурсом. А уж если на форме какой-нибудь таймер висит, то она вообще не будет уничтожена.
Так что либо после использования вызывайте на форме Dispose, либо оборачивайте в блок using, что почти одно и то же.
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
09.04.2012, 13:59  [ТС] 7
а может просто напросто создать один раз и вызывать по мере необходимости
но почему то второй раз не вызывается пишет - для этой формы был уже выполнен метод close
0
Эксперт .NET
14836 / 11224 / 2946
Регистрация: 17.09.2011
Сообщений: 18,794
09.04.2012, 14:00 8
Форму, закрытую однажды, невозможно открыть снова.
Либо создавайте каждый раз новую, либо просто скрывайте через метод Hide.
Скрывать или создавать новую - зависит от частоты ее использования. Если новая форма открывается раз в год, то нет смысла ей постоянно в памяти висеть.
1
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
09.04.2012, 14:01  [ТС] 9
а можно удалить как то событие, назначенное элементу. а то я содаю элемент, назначаю ему событие - потом элемент удаляю создаю новый такой же - а событие как то накладывается что ли- в общем- вызывается второй раз!

Добавлено через 28 секунд
kolorotur
спасибо я понял !
0
Эксперт .NET
14836 / 11224 / 2946
Регистрация: 17.09.2011
Сообщений: 18,794
09.04.2012, 14:02 10
Цитата Сообщение от Анарион Посмотреть сообщение
а можно удалить как то событие, назначенное элементу
Удаляется точно так же, как добавляется, только через оператор -=

Цитата Сообщение от Анарион Посмотреть сообщение
я содаю элемент, назначаю ему событие - потом элемент удаляю создаю новый такой же - а событие как то накладывается что ли- в общем- вызывается второй раз!
А он просто-напросто не удаляется, если имеется подписка на событие, так как в событии держатся ссылки на всех подписчиков, вот у вас и утечка памяти получается, а до кучи еще и побочный эффект.
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
09.04.2012, 14:03  [ТС] 11
а как удалить событие у конкретного элемента?
0
Эксперт .NET
14836 / 11224 / 2946
Регистрация: 17.09.2011
Сообщений: 18,794
09.04.2012, 14:04 12
А как вы его создавали?
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
09.04.2012, 14:05  [ТС] 13
umass[i].MouseClick += new System.Windows.Forms.MouseEventHandler(m_clk);
0
Эксперт .NET
14836 / 11224 / 2946
Регистрация: 17.09.2011
Сообщений: 18,794
09.04.2012, 14:06 14
Цитата Сообщение от Анарион Посмотреть сообщение
umass[i].MouseClick += new System.Windows.Forms.MouseEventHandler(m_clk);
Прекрасно.
Теперь читаем мой предыдущий ответ:
Цитата Сообщение от kolorotur Посмотреть сообщение
Удаляется точно так же, как добавляется, только через оператор -=
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
09.04.2012, 14:13  [ТС] 15
прикольно. спасибо. а точно - если не удалить событие- объект не удаляется? у меня прекрастно удалился и пропал с формы!!!
0
Эксперт .NET
14836 / 11224 / 2946
Регистрация: 17.09.2011
Сообщений: 18,794
09.04.2012, 14:19 16
Цитата Сообщение от Анарион Посмотреть сообщение
а точно - если не удалить событие- объект не удаляется?
Объект, в котором находится событие, держит ссылку на всех подписчиков этого события.
То есть подписчики не будут удалены сборщиком до тех пор, пока они не отпишутся от этого события.

В вашем случае скорее всего такой проблемы не будет, т.к. в данном случае событие определено в самих элементах, а не на форме, например. Потому удалены они будут. Но не сразу, как вы понимаете. Отсюда и повторные срабатывания.

Цитата Сообщение от Анарион Посмотреть сообщение
пропал с формы!!!
Пропал с формы - не значит, что удалился из памяти.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2012, 14:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Что означает %k в данном случае?
#include <iostream> #include <conio.h> using namespace std; void main() { int i,j,k;...

Оправдана ли в данном случае рекурсия?
private TreeNode FindRoot(TreeNode Node) { if ((Node.Parent)==null) ...

Как улучшить ПК в данном случае?
Всем привет! Подскажите, пожалуйста: "Что в моём ПК на данный момент является слабым звеном -...

Зашить стороннее приложение в ресурсы и запускать только в определенном случае
Привет всем. Незнаю как это правильно называется, но я хочу сделать какбы оболочку для исполняемого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.