0
我很难从包括TWebActionItem
的同步包装我的头。从TWebAction中提取代码以便在主线程中同步()ing?
我的web服务是具有形式的视觉程序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的上下文中正确执行它?