Врямя жизни модуля (НЕ класса).

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Врямя жизни модуля (НЕ класса).

Сообщение 0xy » 16.07.2010 (Пт) 0:14

Как долго будет жить (после инициализации) переменная Static в процедуре автономного модуля?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Врямя жизни модуля (НЕ класса).

Сообщение Хакер » 16.07.2010 (Пт) 0:37

Что значит автономный модуль?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Врямя жизни модуля (НЕ класса).

Сообщение 0xy » 16.07.2010 (Пт) 2:10

Тот, который в проекте VB называется просто "модуль" :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Врямя жизни модуля (НЕ класса).

Сообщение Хакер » 16.07.2010 (Пт) 2:12

В рамках проекта какого типа?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Врямя жизни модуля (НЕ класса).

Сообщение 0xy » 16.07.2010 (Пт) 2:23

Проекта exe-файла.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Врямя жизни модуля (НЕ класса).

Сообщение Хакер » 16.07.2010 (Пт) 2:30

До конца.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Врямя жизни модуля (НЕ класса).

Сообщение 0xy » 16.07.2010 (Пт) 2:49

А есть ли разница (в плане долгожительства) между переменной (Private), описанной на уровне модуля, и Static, описанной в процедуре этого модуля?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Врямя жизни модуля (НЕ класса).

Сообщение Viper » 16.07.2010 (Пт) 4:58

0xy писал(а):А есть ли разница (в плане долгожительства) между переменной (Private), описанной на уровне модуля, и Static, описанной в процедуре этого модуля?
Они обе будут жить до завершения программы.
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Врямя жизни модуля (НЕ класса).

Сообщение Хакер » 16.07.2010 (Пт) 15:26

Если это пременные EXE-проекта. С библиотеками всё иначе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Врямя жизни модуля (НЕ класса).

Сообщение 0xy » 16.07.2010 (Пт) 15:50

А как с библиотеками?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Врямя жизни модуля (НЕ класса).

Сообщение Хакер » 16.07.2010 (Пт) 17:08

В соответствии со спецификацией: ActiveX — это поставщик классов (и их фабрик), контейнер их кода, регистратор их данных в реестре и счётчик их количества. И ничто больше. Именно по этой причине, а не из вредности, MS не сделали в VB экспорт обычных функций (а я сделал).

Поскольку ActiveX-сервер это только поставщик классов, будучи inproc-сервером и работая как модуль (в виндовом смысле слова) внутри процесса-хоста (клиента), нет никакой причины модулю быть загруженным в процесс, если в текущий момент не существует ни одного экземпляра объекта его класса.

Поэтому, любой inproc-сервер ведёт подсчёт своих объектов для того, чтобы быть способным в любой момент сказать:
  • Есть объекты, которые я создал и за которые отвечаю, поэтому меня нельзя выгружать.
  • Сейчас нет объектов, которые бы я создал, поэтому меня можно спокойно выгрузить, я никому сейчас не нужен.
Отвечает на этот вопрос функция DllCanUnloadNow, которую любой inproc-сервер должен экспортировать.

Таким образом, если сервер не породил ни одного объекта (которые бы до сих пор были живыми), он может быть выгружен в любой момент (предугадать невозможно). Причём выгружает его COM, а не сам сервер выгружает себя; сам сервер только докладывает, можно ли его выгрузить.

Если говорить об обычных (неVB) модулях (в виндовом смысле этого слова), то там «смерть» глобальных и статических переменных происходит при выгрузке модуля из АП процесса.

Если перенести это на не просто модули, а на ActiveX-библиотеки, выполненные как модули, получается неопределённость.
Если все объекты умерли, глобальная переменная может:
  • как дожить до момента рождения следующего объекта, если модулю повезёт остаться не выгруженным
  • так и не дожить до него, если COM внезапно решит выгрузить модуль до наступления этого момента (и загрузит обратно при его наступлении).

Получается плохая ситуация (любая неопределённость в программировании — очень плохая ситуация): программист не может полагаться на глобальные и статические переменные, потому что они могут как обнулиться, так и не обнулиться (в зависимости от текущей ситуацией с памятью и инициативой COM выгружать ненужные модули).

Поэтому неопределённое поведение устранили, внеся в это дело определённость: вне зависимости от того, будет ли выгружен из памяти неиспользуемый модуль или не будет, как только модуль становится неиспользуемым, то есть, как только счётчик порождённых объектов достигаетя значения ноль, VB насильно зануляет все глобальные и статические переменные.

С учётом этого, нет разницы, будет ли между смертью последнего объекта и рождением нового первого произведена выгрузка (с повторной загрузкой при рождении) модуля, или же не будет — в любом случае при смерти последнего объекта гл./стат. переменные зануляются, и к моменту создания нового будут гарантировано обнулены.

Собственно, ответ и на вопрос и само определённое поведение таково: время жизни глобальных и статических переменных в ActiveX-бибилиотеках соответствует объединению (мат. опер.) времён жизни всех объектов, принадлежащих этой библиотеки, и заканчивается смертью последнего из них.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Врямя жизни модуля (НЕ класса).

Сообщение 0xy » 16.07.2010 (Пт) 18:54

А для простой dll (НЕ ActiveX) дело обстоит так же, как c exe?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Врямя жизни модуля (НЕ класса).

Сообщение iGrok » 16.07.2010 (Пт) 19:33

0xy писал(а):А для простой dll (НЕ ActiveX) дело обстоит так же, как c exe?

А проявить чудеса внимательности?

Хакер писал(а):...
Если говорить об обычных (неVB) модулях (в виндовом смысле этого слова), то там «смерть» глобальных и статических переменных происходит при выгрузке модуля из АП процесса.
...
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 101

    TopList