На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Работа с объектами
    Странное дело. Есть у меня объект, повязанные с формой:
    ExpandedWrap disabled
      ' procedura1
      Set frmSA(0) = new Form1
      Set frmSA(1) = new Form2(А может быть и на Form1, или еще с 5-10 форм)

    По окончанию работы с объектами, я их выгружаю и отпускаю ссылки на них
    ExpandedWrap disabled
      Unload frmSA(0)
      Unload frmSA(1)
      set frmSA(0) = nothing
      set frmSA(1) = nothing

    Казалось бы, все вроде сделано правильно.
    Но на самом деле объекты не выгружены. И когда мы делаем следующую итерацию c procedura1(так же с окончанием и выгрузкой), память программа всё больше и больше отжирает.
    Да, получается где-то на frmSA затаился какой-то объект, который не выгружается, и frmSA никак не может завершить Unload. Как быть? Как вычислить? АПИ функцией DestroyWindow пробовал, не помогает.
    Может какой-то мусоросборник надо сделать? Как это делается?
      Цитата Bubaylo @
      где-то на frmSA затаился какой-то объект, который не выгружается

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

      Добавлено
      А так всякого дерьма, которое запросто может зависать при выгрузке - немеряно... всякие там соединения с БД, COM-объекты вроде экселевского хост-процесса и пр...
        Тут несколько вариантов предлагают:
        https://stackoverflow.com/questions/4216471...stroy-an-object
          ^D^ima
          Чё-то я как попка-дурак, прочел, но не понял, что они предлагают...
          ПС
          With я не пользуюсь для таких объектов.
            Цитата Bubaylo @
            не понял, что они предлагают...

            Они предлагают не делать
            ExpandedWrap disabled
              Dim variable As New object
            а использовать
            ExpandedWrap disabled
              Dim variable As object
              Set variable = New object

            Либо вообще не определять переменную явно, оборачивая блок, её использующий, в блок With
            ExpandedWrap disabled
              With New object
              ' ...
              End With

            Второй вариант применим только в случае одновременного использования не более чем одного объекта.
            Первый - только при раннем связывании.
            В случае позднего связывания оба способа не работают.

            Добавлено
            В общем, надо внимательнее следить за объектными переменными. Что используется только в одной форме - явно выгружать? лучше сразу после использования, ну или хотя бы в Form_Unload. А если объект используется глобально - не допускать его повторной инициализации (проверять, что переменная Is Nothing).
              Цитата Akina @
              Dim variable As New object

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

              Dim variable As object
              Set variable = New object


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

              Перед любым
              ExpandedWrap disabled
                Set frmSA(n)=new Form

              Я проверяю frmSA на Nothing. Если не Nothing, то Unload frmSA(n) и потом set frmSA(n) = Nothing.

              Сейчас буду изучать все "Set = " и чтоб они обязательно после использования были Nothing.
              Ничего другого в ум не приходит, кроме как заставить Виндовс обнулять принудительно память...
                Bubaylo
                А у тебя случайно нигде нет чего-то, что грузится через CreateObject? самая опасная в контексте вопроса шняга...
                  Akina
                  Ща при помощи MZTools поискал. Нашел пару мест, заменил на "New ObjLib.*" ( Видать когда-то давно с поздним связыванием эксперименты ставил...) но не помогло.
                  Но в этом ObjLib есть элементы, которые несут свою CreateObject. Уж не знаю, тоже самое оно или нет, но смысл заключается тоже в связанности позднем. Но без неё вообще никак.

                  Добавлено
                  При помощи Spy++ посмотрел, какие сообщения происходят на форме. DESTROY проходит, но не дестроится...
                  Сообщение отредактировано: Bubaylo -
                    Bubaylo
                    Верным делом не все формы таким страдают, а только некоторые... или все? Если таки все - попробуй добавить в проект пустую форму и точно так же её загрузить и выгрузить, посмотреть, останется ли что-то от неё...
                      Akina
                      Вот те, которые подразумевают, что я их буду в frmSA устанавливать - они все страдают. Там куча UserControl-ов, и т.д.
                      Я уже всё...спёкся... 15 шагов ещё терпит, на 16м начинается чертовщина...То контрол не той версии, то еще чего...
                      Может это дело в UserControl-aх? Не уж то их все надо в ActivX скомпилить придется?

                      Добавлено
                      У меня тут шальная идея родилась.
                      А что если я все эти формы загоню в DLL, и их буду брать оттуда? И когда надо выгружать - рву связь с DLL и всего делов...А?
                      ПС
                      Правда я даже не представлю, сколько у меня уйдет время на то, чтоб так переделать... все же эти формы используют и классы, и ЮзерКонтролы...
                        Абсолютно точно установил, что если
                        ExpandedWrap disabled
                          Set frm1 = new form1' память выделилась
                           
                           
                          set frm1 = nothing ' освобождается.


                        Значит я какие-то переменные внутри не освобождаю, а такие есть.
                        Ну хоть чуть ближе пододвинулся к решению...
                          Все! Победил!!!!
                          Действительно, нашел парочку объектов, которые в деструкторе не ставились в Nothing.
                          Всем спасибо!!!!
                          Вот не думал я, что надо все убивать, а не один главный объект...думал грохнул его, и остальные автоматом...
                          Сообщение отредактировано: Bubaylo -
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0367 ]   [ 16 queries used ]   [ Generated: 19.04.24, 13:19 GMT ]