Выгрузка глобального объекта

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Выгрузка глобального объекта

Сообщение galover »

Есть проект. В vih файле этого проекта описана глобальная переменная - ссылка на мой интерфейс

Код: Выделить всё

// SomeFile.vih
#ifndef SomeFile_vih
#define SomeFile_vih
#component "SomeComp"

var _myVar : MyComp::MyFace new;
#end
Первое обращение к интерфейсу моей компоненты идет из Отчетов пользователя - > _myVar инстанциируется, все нормально. Но вот по окончании работы с интерфейсами компоненты, выгрузки не происходит, даже если закрыть все открытые интерфейсы (по сути освободить все ссылки). Т.е. при следующем открытии отчетов пользователя моя переменная содержит старые значения (внутри MyComp::MyFace содержится кэш, который я хочу обнулять). Я же хочу чтобы переменная _myVar выгружалась, если нет ни одной ссылки на интерфейсы моей компоненты! Затык в том, что нет такого места куда я могу вставить FreeVipInterface, так как переменная глобальная и не принадлежит ни одному интерфейсу. Что можно сделать? Может есть какое-то глобальное событие?
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Это как с глобальной библиотекой функций: владелец переменной - приложение. Пока живо приложение, жива и копия интерфейса.
Виталий
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

ясно, просто непонятно стало - ссылок нет, а выгрузка не происходит
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

А где видно, что ссылок нет? Или речь о том, что нет явных ссылок?
Виталий
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

На экране нет ни одного интерфейса, они все выгружены, явных ссылок нет. Судя по документации, если кол-во ссылок = 0, то происходит выгрузка
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Отладчиком можно посмотреть.
В galnet.cfg прописываем:

[DEBUG]
EnableVipDebugger = on

В Галактике жмем Ctrl+Shift+F12, идем на закладку "Загруженные интерфейсы", жмем Ctrl+R (на всякий случай, чтобы освежить), ищем нашу реализацию, смотрим колонку "Счетчик ссылок". Только у cacheable-интерфейсов она может быть равна нулю (ссылок - 0, но экземпляр всё еще жив и располагается в кэше).

Владельцем нашей глобальной переменной выступает приложение. Так устроено.
Виталий
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Screw
спасибо
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

глючный правда этот отладчик, упал, после чего Галактика закрылась. Предложение - хотелось бы видеть не только сам интерфейс, но и его компоненту, а то не совсем удобно просматривать
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Презабавно. У меня что-то не падает. А будучи прикладником, я часто сталкивался с необходимостью его использования. Впрочем, речь не том.
Таки есть искомая ссылка?

А про имена компонентов - это в ПИР.
Виталий
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

да, ссылка есть, при первом обращении ссылка создается и потом не удаляется, даже если закрыть все интерфейсы
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Выгрузка глобального объекта

Сообщение Алексей »

В версии 9.1 стала падать галактика если её свернуть и развернуть через 10 минут.
В самой галактике был открыт интерфейс, на который навешан ЦРФ который использует функцию ДЛЛ, которая вызывает метод объектного интерфейса.

Так вот если у интерфейса стоит атрибут cacheable - то когда разворачиваешь Галактику через 10 минут получаем необработанное исключение с сообщением, что "Объект был освобожден - ссылка сломана (имя интерфейса)".

Если атрибут убрать - вроде бы работает, не падает... пока тестирую. Может можно каким-нибудь параметром убрать автоматическое освобождение объектов?
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: Выгрузка глобального объекта

Сообщение Screw »

Ого! 5-летний перерыв в цепочке - это впечатляет! :)
Моё почтение!
Атрибут cacheable, как я понял, взведён у интерфейса, используемого функцией из динамической библиотеки.
По сути дела: ни о каком автоматическом освобождении интерфейсов мне не известно. До тех пор, пока счётчик ссылок на интерфейс больше нуля, никто не может уничтожить его - вне зависимости от наличия или отсутствия атрибута cachable.
Пожалуй, ответ следует искать в коде функции. Хорошо бы посмотреть, как именно она инстанциирует экземпляр интерфейса, когда и как освобождает его.
Виталий
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Выгрузка глобального объекта

Сообщение Алексей »

Спасибо что откликнулись! В понедельник обязательно выложу код функции на паскале... Убрал атрибут cacheable - вроде бы падать перестало, но сегодня пользователь позвонил и сказал что после длительного простоя галактики (была свернута), пришла, открыла и... то же самое...
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Выгрузка глобального объекта

Сообщение Алексей »

В общем если свернуть Галактику и не работать какое то время, получаем сообщение выше что ссылка утеряна и вот это сообщение в черное окно "Vip-интерфейс my_OS::viMoreFunc не загрузился". Как в паскале проверить что ссылка не потеряна, а если потеряна реинициализировать объектный интерфейс ещё раз?
Падает с атрибутом cacheable у интерфейса и если убрать этот атрибут.

Параметры кэширования: например Database.CacheTime

Код: Выделить всё

function DaiSpKatOsBuh(cKatOs_par:comp;F:word) : string;  
var
  Caller: PIfcMethodsCaller;
  method : word;
begin
  Caller := nil;
  Caller := InitGet('my_OS::oiMoreFunc', 'my_OS::viMoreFunc');
  if not Assigned(Caller) or not GetMethodByName(Caller, 'DaiSpKatos') then
  begin
    writeln('Vip-интерфейс my_OS::viMoreFunc не загрузился'); // отладка
  end
  else
    begin
      method := 1;
      CreateParmFields(Caller);
      PutParmValue(Caller, 1, method );       // метод учета 1 - БУ, 2 - НУ
      PutParmValue(Caller, 2, cKatos_par);    // ссылка на карточку
      PutParmValue(Caller, 3, F);             // непосредственно параметр
      CallMethod(Caller);
      GetResultValue(Caller, Result);
    end;
  if (Caller<>nil) then FreeObj(Caller);
end;
Ответить