Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата Bubaylo @
где-то на frmSA затаился какой-то объект, который не выгружается

Гм... сразу вопрос - почему именно массив форм? если это одна объектная переменная - всё нормально? или всё равно не выгружается?

Добавлено
А так всякого дерьма, которое запросто может зависать при выгрузке - немеряно... всякие там соединения с БД, 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
Цитата Bubaylo @
не понял, что они предлагают...

Они предлагают не делать
<{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
Цитата Akina @
Dim variable As New object

До такого я и не догадывался, у меня всё объекты:
Цитата Akina @

Dim variable As object
Set variable = New object


Цитата Akina @
не допускать его повторной инициализации (проверять, что переменная Is Nothing).

Перед любым
<{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.
Всем спасибо!!!!
Вот не думал я, что надо все убивать, а не один главный объект...думал грохнул его, и остальные автоматом...

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)