Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.115.179] |
|
Сообщ.
#1
,
|
|
|
Странное дело. Есть у меня объект, повязанные с формой:
' procedura1 Set frmSA(0) = new Form1 Set frmSA(1) = new Form2(А может быть и на Form1, или еще с 5-10 форм) По окончанию работы с объектами, я их выгружаю и отпускаю ссылки на них Unload frmSA(0) Unload frmSA(1) set frmSA(0) = nothing set frmSA(1) = nothing Казалось бы, все вроде сделано правильно. Но на самом деле объекты не выгружены. И когда мы делаем следующую итерацию c procedura1(так же с окончанием и выгрузкой), память программа всё больше и больше отжирает. Да, получается где-то на frmSA затаился какой-то объект, который не выгружается, и frmSA никак не может завершить Unload. Как быть? Как вычислить? АПИ функцией DestroyWindow пробовал, не помогает. Может какой-то мусоросборник надо сделать? Как это делается? |
Сообщ.
#2
,
|
|
|
Цитата Bubaylo @ где-то на frmSA затаился какой-то объект, который не выгружается Гм... сразу вопрос - почему именно массив форм? если это одна объектная переменная - всё нормально? или всё равно не выгружается? Добавлено А так всякого дерьма, которое запросто может зависать при выгрузке - немеряно... всякие там соединения с БД, COM-объекты вроде экселевского хост-процесса и пр... |
Сообщ.
#3
,
|
|
|
Тут несколько вариантов предлагают:
https://stackoverflow.com/questions/4216471...stroy-an-object |
Сообщ.
#4
,
|
|
|
^D^ima
Чё-то я как попка-дурак, прочел, но не понял, что они предлагают... ПС With я не пользуюсь для таких объектов. |
Сообщ.
#5
,
|
|
|
Цитата Bubaylo @ не понял, что они предлагают... Они предлагают не делать Dim variable As New object Dim variable As object Set variable = New object Либо вообще не определять переменную явно, оборачивая блок, её использующий, в блок With With New object ' ... End With Второй вариант применим только в случае одновременного использования не более чем одного объекта. Первый - только при раннем связывании. В случае позднего связывания оба способа не работают. Добавлено В общем, надо внимательнее следить за объектными переменными. Что используется только в одной форме - явно выгружать? лучше сразу после использования, ну или хотя бы в Form_Unload. А если объект используется глобально - не допускать его повторной инициализации (проверять, что переменная Is Nothing). |
Сообщ.
#6
,
|
|
|
Цитата Akina @ Dim variable As New object До такого я и не догадывался, у меня всё объекты: Цитата Akina @ Dim variable As object Set variable = New object Цитата Akina @ не допускать его повторной инициализации (проверять, что переменная Is Nothing). Перед любым Set frmSA(n)=new Form Я проверяю frmSA на Nothing. Если не Nothing, то Unload frmSA(n) и потом set frmSA(n) = Nothing. Сейчас буду изучать все "Set = " и чтоб они обязательно после использования были Nothing. Ничего другого в ум не приходит, кроме как заставить Виндовс обнулять принудительно память... |
Сообщ.
#7
,
|
|
|
Bubaylo
А у тебя случайно нигде нет чего-то, что грузится через CreateObject? самая опасная в контексте вопроса шняга... |
Сообщ.
#8
,
|
|
|
Akina
Ща при помощи MZTools поискал. Нашел пару мест, заменил на "New ObjLib.*" ( Видать когда-то давно с поздним связыванием эксперименты ставил...) но не помогло. Но в этом ObjLib есть элементы, которые несут свою CreateObject. Уж не знаю, тоже самое оно или нет, но смысл заключается тоже в связанности позднем. Но без неё вообще никак. Добавлено При помощи Spy++ посмотрел, какие сообщения происходят на форме. DESTROY проходит, но не дестроится... |
Сообщ.
#9
,
|
|
|
Bubaylo
Верным делом не все формы таким страдают, а только некоторые... или все? Если таки все - попробуй добавить в проект пустую форму и точно так же её загрузить и выгрузить, посмотреть, останется ли что-то от неё... |
Сообщ.
#10
,
|
|
|
Akina
Вот те, которые подразумевают, что я их буду в frmSA устанавливать - они все страдают. Там куча UserControl-ов, и т.д. Я уже всё...спёкся... 15 шагов ещё терпит, на 16м начинается чертовщина...То контрол не той версии, то еще чего... Может это дело в UserControl-aх? Не уж то их все надо в ActivX скомпилить придется? Добавлено У меня тут шальная идея родилась. А что если я все эти формы загоню в DLL, и их буду брать оттуда? И когда надо выгружать - рву связь с DLL и всего делов...А? ПС Правда я даже не представлю, сколько у меня уйдет время на то, чтоб так переделать... все же эти формы используют и классы, и ЮзерКонтролы... |
Сообщ.
#11
,
|
|
|
Абсолютно точно установил, что если
Set frm1 = new form1' память выделилась set frm1 = nothing ' освобождается. Значит я какие-то переменные внутри не освобождаю, а такие есть. Ну хоть чуть ближе пододвинулся к решению... |
Сообщ.
#12
,
|
|
|
Все! Победил!!!!
Действительно, нашел парочку объектов, которые в деструкторе не ставились в Nothing. Всем спасибо!!!! Вот не думал я, что надо все убивать, а не один главный объект...думал грохнул его, и остальные автоматом... |