Первое обращение к интерфейсу моей компоненты идет из Отчетов пользователя - > _myVar инстанциируется, все нормально. Но вот по окончании работы с интерфейсами компоненты, выгрузки не происходит, даже если закрыть все открытые интерфейсы (по сути освободить все ссылки). Т.е. при следующем открытии отчетов пользователя моя переменная содержит старые значения (внутри MyComp::MyFace содержится кэш, который я хочу обнулять). Я же хочу чтобы переменная _myVar выгружалась, если нет ни одной ссылки на интерфейсы моей компоненты! Затык в том, что нет такого места куда я могу вставить FreeVipInterface, так как переменная глобальная и не принадлежит ни одному интерфейсу. Что можно сделать? Может есть какое-то глобальное событие?
Отладчиком можно посмотреть.
В galnet.cfg прописываем:
[DEBUG]
EnableVipDebugger = on
В Галактике жмем Ctrl+Shift+F12, идем на закладку "Загруженные интерфейсы", жмем Ctrl+R (на всякий случай, чтобы освежить), ищем нашу реализацию, смотрим колонку "Счетчик ссылок". Только у cacheable-интерфейсов она может быть равна нулю (ссылок - 0, но экземпляр всё еще жив и располагается в кэше).
Владельцем нашей глобальной переменной выступает приложение. Так устроено.
глючный правда этот отладчик, упал, после чего Галактика закрылась. Предложение - хотелось бы видеть не только сам интерфейс, но и его компоненту, а то не совсем удобно просматривать
Презабавно. У меня что-то не падает. А будучи прикладником, я часто сталкивался с необходимостью его использования. Впрочем, речь не том.
Таки есть искомая ссылка?
В версии 9.1 стала падать галактика если её свернуть и развернуть через 10 минут.
В самой галактике был открыт интерфейс, на который навешан ЦРФ который использует функцию ДЛЛ, которая вызывает метод объектного интерфейса.
Так вот если у интерфейса стоит атрибут cacheable - то когда разворачиваешь Галактику через 10 минут получаем необработанное исключение с сообщением, что "Объект был освобожден - ссылка сломана (имя интерфейса)".
Если атрибут убрать - вроде бы работает, не падает... пока тестирую. Может можно каким-нибудь параметром убрать автоматическое освобождение объектов?
Ого! 5-летний перерыв в цепочке - это впечатляет!
Моё почтение!
Атрибут cacheable, как я понял, взведён у интерфейса, используемого функцией из динамической библиотеки.
По сути дела: ни о каком автоматическом освобождении интерфейсов мне не известно. До тех пор, пока счётчик ссылок на интерфейс больше нуля, никто не может уничтожить его - вне зависимости от наличия или отсутствия атрибута cachable.
Пожалуй, ответ следует искать в коде функции. Хорошо бы посмотреть, как именно она инстанциирует экземпляр интерфейса, когда и как освобождает его.
Спасибо что откликнулись! В понедельник обязательно выложу код функции на паскале... Убрал атрибут cacheable - вроде бы падать перестало, но сегодня пользователь позвонил и сказал что после длительного простоя галактики (была свернута), пришла, открыла и... то же самое...
В общем если свернуть Галактику и не работать какое то время, получаем сообщение выше что ссылка утеряна и вот это сообщение в черное окно "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;