Извлечение кода из TWebAction для синхронизации() в основном потоке?

Мне трудно понять, как использовать Synchronize from a TWebActionItem.

Мой веб-сервис - это визуальная программа с формой TFormWebServices

var FormWebServices: TFormWebServices;

У этого есть свойство FWebBrokerBridge: TIdHTTPWebBrokerBridge
FWebBrokerBridge регистрирует TWebModuleWebServices как классы для использования для каждого входящего вызова:

FWebBrokerBridge.RegisterWebModuleClass(TWebModuleWebServices);

Элементы TWebActionItem в этом классе выполняют работу по чтению TWebRequest и записи TWebResponse.

Есть один обработчик, который должен использовать некоторый визуальный рендеринг VCL (общий код с другим приложением), и я хочу синхронизировать его с основным потоком (FormWebServices).

Заглушка:

TWebModuleWebServices = class(TWebModule)
  procedure WebModuleWebServicesTTGetDynReportAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  procedure WebModuleAfterDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
 private
   FResponse: TResBase;     // JSON response object
 end;   

procedure TWebModuleWebServices.WebModuleWebServicesTTGetDynReportAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  lFrmDynRapport : TFormDynRapport;   // A form containing the common code, has VCL components
begin
  lResponse := (FResponse as TResGetDynReport);  // TResGetDynReport = class(TResBase)
  // ...  
  lFrmDynRapport := TFormDynRapport.Create(Self);
  try
     with lFrmDynRapport do
     begin
        // Do visual stuff with grids, read grid settings, fill lResponse with info specific for this webaction
     end
  finally
  end   
  // ...
end;  

procedure TWebModuleWebServices.WebModuleAfterDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var lJSO: ISuperObject;  // SuperObject library
begin
  lJSO := FResponse.ToJson;
  // ...
  Response.Content := lJSO.AsString;
  Handled := true;
end;

Теперь, как я могу правильно синхронизировать блок try/finally? Я могу добраться до текущего потока и сделать что-то простое, например:

lThread := TThread.CurrentThread;
TThread.Synchronize(lThread,procedure
  begin
    FormWebServices.MmoLog.Lines.Add('Synchronize test');
  end);

но для чего-то более сложного я застрял.
Определение локальных процедур и передача их в Synchronize не работает (E2555 не может захватить символ).
Как я могу извлечь try/ finally блокировать, чтобы я мог правильно выполнить его в контексте FormWebServices?


person Jan Doggen    schedule 27.12.2016    source источник


Ответы (1)