SASGIS - SAS.Планета
View Issue Details
0003452SAS.Планета[All Projects] Хотелкаpublic06-06-2019 08:4807-06-2019 07:27
zed 
zed 
normalminorhave not tried
resolvedfixed 
181221 
190707190707 
0003452: Добавить возможность использовать глобальные переменные в PascalScript
Нужна возможность использовать глобальные переменные для доступа к ним из всех экземпляров скриптов. Так же, нужен глобальный лок, чтобы выполнять какую-то часть скрипта в один поток (выполнение http запроса и получение токена, версии и проч.).

Предлагаю реализовать вот такой интерфейс:


  IPascalScriptGlobal = interface
    procedure Lock;
    procedure Unlock;

    procedure LockRead;
    procedure UnlockRead;

    procedure SetVar(const AVarID: Integer; const AValue: Variant);
    procedure SetVarTS(const AVarID: Integer; const AValue: Variant);

    function GetVar(const AVarID: Integer): Variant;
    function GetVarTS(const AVarID: Integer): Variant;

    function Exists(const AVarID: Integer): Boolean;
    function ExistsTS(const AVarID: Integer): Boolean;
  end;

Функции с приставкой TS (ThreadSafe) должны сами обеспечивать потокобезопасность. Для использования функций без этой приставки, юзеру надо предварительно вызывать Lock функции.
No tags attached.
Issue History
06-06-2019 08:48zedNew Issue
06-06-2019 08:48zedStatusnew => assigned
06-06-2019 08:48zedAssigned To => zed
06-06-2019 15:56vdemidovNote Added: 0018734
06-06-2019 17:09zedNote Added: 0018735
07-06-2019 07:21zedStatusassigned => resolved
07-06-2019 07:21zedFixed in Version => 190707
07-06-2019 07:21zedResolutionopen => fixed
07-06-2019 07:27zedNote Added: 0018736

Notes
(0018734)
vdemidov   
06-06-2019 15:56   
Ты имеешь в виду вообще глобальных переменных или в пределах одного сервиса?
(0018735)
zed   
06-06-2019 17:09   
В пределах карты, более глобально пока не требуется.
(0018736)
zed   
07-06-2019 07:27   
Доступ к интерфейсу - через переменную Global. Например:


  var
    s: string;
  begin
    ...
    Global.Lock;
    try
      if Global.Exists(0) then begin
        s := Global.GetVar(0);
      end else begin
        Global.SetVar(0, s);
      end;
    finally
      Global.Unlock;
    end;
    ...