Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Visual Basic: Общие вопросы > Работа с объектами |
Автор: Bubaylo 01.03.18, 10:51 |
Странное дело. Есть у меня объект, повязанные с формой: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ' procedura1 Set frmSA(0) = new Form1 Set frmSA(1) = new Form2(А может быть и на Form1, или еще с 5-10 форм) По окончанию работы с объектами, я их выгружаю и отпускаю ссылки на них <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Unload frmSA(0) Unload frmSA(1) set frmSA(0) = nothing set frmSA(1) = nothing Казалось бы, все вроде сделано правильно. Но на самом деле объекты не выгружены. И когда мы делаем следующую итерацию c procedura1(так же с окончанием и выгрузкой), память программа всё больше и больше отжирает. Да, получается где-то на frmSA затаился какой-то объект, который не выгружается, и frmSA никак не может завершить Unload. Как быть? Как вычислить? АПИ функцией DestroyWindow пробовал, не помогает. Может какой-то мусоросборник надо сделать? Как это делается? |
Автор: Akina 01.03.18, 11:32 |
Гм... сразу вопрос - почему именно массив форм? если это одна объектная переменная - всё нормально? или всё равно не выгружается? Добавлено А так всякого дерьма, которое запросто может зависать при выгрузке - немеряно... всякие там соединения с БД, COM-объекты вроде экселевского хост-процесса и пр... |
Автор: ^D^ima 01.03.18, 11:36 |
Тут несколько вариантов предлагают: https://stackoverflow.com/questions/4216471...stroy-an-object |
Автор: Bubaylo 01.03.18, 12:02 |
^D^ima Чё-то я как попка-дурак, прочел, но не понял, что они предлагают... ПС With я не пользуюсь для таких объектов. |
Автор: Akina 01.03.18, 12:14 |
Они предлагают не делать <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> а использоватьDim variable As New object <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim variable As object Set variable = New object Либо вообще не определять переменную явно, оборачивая блок, её использующий, в блок With <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> With New object ' ... End With Второй вариант применим только в случае одновременного использования не более чем одного объекта. Первый - только при раннем связывании. В случае позднего связывания оба способа не работают. Добавлено В общем, надо внимательнее следить за объектными переменными. Что используется только в одной форме - явно выгружать? лучше сразу после использования, ну или хотя бы в Form_Unload. А если объект используется глобально - не допускать его повторной инициализации (проверять, что переменная Is Nothing). |
Автор: Bubaylo 01.03.18, 12:41 |
До такого я и не догадывался, у меня всё объекты: Перед любым <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set frmSA(n)=new Form Я проверяю frmSA на Nothing. Если не Nothing, то Unload frmSA(n) и потом set frmSA(n) = Nothing. Сейчас буду изучать все "Set = " и чтоб они обязательно после использования были Nothing. Ничего другого в ум не приходит, кроме как заставить Виндовс обнулять принудительно память... |
Автор: Akina 01.03.18, 12:50 |
Bubaylo А у тебя случайно нигде нет чего-то, что грузится через CreateObject? самая опасная в контексте вопроса шняга... |
Автор: Bubaylo 01.03.18, 13:13 |
Akina Ща при помощи MZTools поискал. Нашел пару мест, заменил на "New ObjLib.*" ( Видать когда-то давно с поздним связыванием эксперименты ставил...) но не помогло. Но в этом ObjLib есть элементы, которые несут свою CreateObject. Уж не знаю, тоже самое оно или нет, но смысл заключается тоже в связанности позднем. Но без неё вообще никак. Добавлено При помощи Spy++ посмотрел, какие сообщения происходят на форме. DESTROY проходит, но не дестроится... |
Автор: Akina 01.03.18, 13:36 |
Bubaylo Верным делом не все формы таким страдают, а только некоторые... или все? Если таки все - попробуй добавить в проект пустую форму и точно так же её загрузить и выгрузить, посмотреть, останется ли что-то от неё... |
Автор: Bubaylo 01.03.18, 14:17 |
Akina Вот те, которые подразумевают, что я их буду в frmSA устанавливать - они все страдают. Там куча UserControl-ов, и т.д. Я уже всё...спёкся... 15 шагов ещё терпит, на 16м начинается чертовщина...То контрол не той версии, то еще чего... Может это дело в UserControl-aх? Не уж то их все надо в ActivX скомпилить придется? Добавлено У меня тут шальная идея родилась. А что если я все эти формы загоню в DLL, и их буду брать оттуда? И когда надо выгружать - рву связь с DLL и всего делов...А? ПС Правда я даже не представлю, сколько у меня уйдет время на то, чтоб так переделать... все же эти формы используют и классы, и ЮзерКонтролы... |
Автор: Bubaylo 01.03.18, 16:28 |
Абсолютно точно установил, что если <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set frm1 = new form1' память выделилась set frm1 = nothing ' освобождается. Значит я какие-то переменные внутри не освобождаю, а такие есть. Ну хоть чуть ближе пододвинулся к решению... |
Автор: Bubaylo 01.03.18, 17:27 |
Все! Победил!!!! Действительно, нашел парочку объектов, которые в деструкторе не ставились в Nothing. Всем спасибо!!!! Вот не думал я, что надо все убивать, а не один главный объект...думал грохнул его, и остальные автоматом... |