2009-02-22 1 views

ответ

4

Нет необходимости явно выгружать модули в VB6. Они автоматически выгружаются при выгрузке последней формы. Язык не поддерживает ссылки на стандартные модули вообще, а только на (глобальные) функции и переменные, определенные в нем. Поскольку вы не можете ссылаться на модуль, вы также не можете их выгружать.

+0

OK, принимая это, отвечая на вопрос. Можете ли вы сказать мне, что если End выгрузит все модули, даже если заявить, что форма все еще загружена? – kjack

+0

Нет, End не выгружает модули. Жаль, что у MS даже есть оператор End. Скорее всего, он оставит незагруженные формы в памяти, создав утечку памяти. – HardCode

+0

Гаркод ошибочен. Оператор End выгружает все формы, объекты и т. Д. Но Конец считается большинством программистов VB6 «Зло». Он не запускает события Unload или QueryUnload или Terminate форм или модулей классов. Справка VB говорит, что он не должен использоваться для нормального завершения программы VB. – MarkJ

3

Не используйте End, вам не нужно (никогда). Затем вся память освобождается должным образом.

Даже с использованием End память должна автоматически освобождаться. Ходили слухи, что некоторые экземпляры классов забыли и не получили правильное завершение, несмотря на подсчет ссылок. Таким образом, было установлено, что лучше всего установить все экземпляры объектов в Nothing (особенно, но не ограничиваясь экземплярами, выделенными в модулях). Я никогда не видел подтверждения, что это действительно так (хотя это может быть, хотя!).

+0

Хорошо, что интересно, спасибо за объяснение причин, почему использование конца не работает – kjack

+0

я имел веб-приложение некоторое время назад с некоторыми dll-серверами vb6, и оно просочилось как сито, пока я явно не очистил все мои объекты. Даже тогда это было не идеально. Настоящий глазник. – johnc

+1

-1 Циркулярные ссылки должны быть явно обработаны. Это может произойти в сложном VB6. Если круговая ссылка не обрабатывается, приложение APPEAR закрывается, но все же остается в качестве процесса пережевывания ресурсов. И является задержкой для совместимости с VB 1.X до 3.X. –

1

Обратите внимание, что если вы используете глобальные переменные, вы должны проверить, нужно ли их очищать. Если это так, у вас должен быть метод CleanUp вашего модуля и вызывать его во время события выгрузки основной формы. Еще одна проблема - иногда ORDER того, как вы разгружаете вещи, важен. Выполняя явную очистку, вы можете это контролировать.

В VB6 вам редко следует использовать END. Если у вас есть круговые ссылки, программа останется как процесс, пережевывающий ресурс, вызывающий различные странные ошибки, когда вы снова запускаете его. С COM-объектами очень легко непреднамеренно настроить цепочку объектов, которая является циклически связанной.

End существует как удержание совместимости с предыдущей версией QuickBASIC и Visual BASIC. Это не вызвало серьезных проблем, пока VB 4.X не представила возможность создавать классы. Это начало привлекать внимание в 5.X.

До этого один из способов сделать это в VB 3.X состоит в том, чтобы две формы задавали ссылки друг на друга.

+0

Эта проблема глобальных переменных применима только к объектным переменным модулей классов, а не к типам данных, найденным в обычных .bas-модулях, правильно? – kjack

+0

«программа останется как процесс, пережевывающий ресурс, вызывающий различные странные ошибки, когда вы снова запускаете его». Но разве это не будет в другом процессе и, следовательно, не сможет вмешиваться в новый экземпляр? – kjack

+0

Пункт №1. Если вы используете UDT или простые типы данных, тогда проблем нет. –

2

Если по модулю вы имеете в виду статические модули .BAS (все они являются модулями: Forms, Classes, UserControls и т. Д.), Вам не нужно «выгружать» их, потому что они static.

Большинство других типов модулей динамически загружаются. В случае Forms обычно через предопределенную глобальную ссылочную переменную с тем же именем и тип, что и класс Form (да, форма - это своего рода класс).

+0

Не могли бы вы объяснить статичность в этом контексте? Я имею в виду, что я понимаю, что такое статическая переменная. – kjack

+0

Такие модули статичны в том смысле, что их код и данные загружаются до тех пор, пока программа запущена, и нет возможности создавать несколько экземпляров данных. – Bob

0

Метод Выгрузки всех модулей на выходе был решен смешной ошибка для получения кода выхода с ExitProcess API вызова()