Страница 1 из 1

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

Добавлено: 25 фев 2010, 21:35
galover
Есть проект. В vih файле этого проекта описана глобальная переменная - ссылка на мой интерфейс

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

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

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

Добавлено: 27 фев 2010, 14:44
Screw
Это как с глобальной библиотекой функций: владелец переменной - приложение. Пока живо приложение, жива и копия интерфейса.

Добавлено: 27 фев 2010, 14:52
galover
ясно, просто непонятно стало - ссылок нет, а выгрузка не происходит

Добавлено: 01 мар 2010, 14:54
Screw
А где видно, что ссылок нет? Или речь о том, что нет явных ссылок?

Добавлено: 01 мар 2010, 16:05
galover
На экране нет ни одного интерфейса, они все выгружены, явных ссылок нет. Судя по документации, если кол-во ссылок = 0, то происходит выгрузка

Добавлено: 01 мар 2010, 16:32
Screw
Отладчиком можно посмотреть.
В galnet.cfg прописываем:

[DEBUG]
EnableVipDebugger = on

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

Владельцем нашей глобальной переменной выступает приложение. Так устроено.

Добавлено: 01 мар 2010, 16:54
galover
Screw
спасибо

Добавлено: 01 мар 2010, 17:03
galover
глючный правда этот отладчик, упал, после чего Галактика закрылась. Предложение - хотелось бы видеть не только сам интерфейс, но и его компоненту, а то не совсем удобно просматривать

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

А про имена компонентов - это в ПИР.

Добавлено: 01 мар 2010, 17:46
galover
да, ссылка есть, при первом обращении ссылка создается и потом не удаляется, даже если закрыть все интерфейсы

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

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

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

Если атрибут убрать - вроде бы работает, не падает... пока тестирую. Может можно каким-нибудь параметром убрать автоматическое освобождение объектов?

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

Добавлено: 27 мар 2015, 13:45
Screw
Ого! 5-летний перерыв в цепочке - это впечатляет! :)
Моё почтение!
Атрибут cacheable, как я понял, взведён у интерфейса, используемого функцией из динамической библиотеки.
По сути дела: ни о каком автоматическом освобождении интерфейсов мне не известно. До тех пор, пока счётчик ссылок на интерфейс больше нуля, никто не может уничтожить его - вне зависимости от наличия или отсутствия атрибута cachable.
Пожалуй, ответ следует искать в коде функции. Хорошо бы посмотреть, как именно она инстанциирует экземпляр интерфейса, когда и как освобождает его.

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

Добавлено: 27 мар 2015, 18:58
Алексей
Спасибо что откликнулись! В понедельник обязательно выложу код функции на паскале... Убрал атрибут cacheable - вроде бы падать перестало, но сегодня пользователь позвонил и сказал что после длительного простоя галактики (была свернута), пришла, открыла и... то же самое...

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

Добавлено: 31 мар 2015, 06:13
Алексей
В общем если свернуть Галактику и не работать какое то время, получаем сообщение выше что ссылка утеряна и вот это сообщение в черное окно "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;