TWebActionItem
からの同期を使用して私の頭を包み込むのに苦労しています。メインスレッドのSynchronize()のためにTWebActionからコードを抽出していますか?
私の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のコンテキストで正しく実行できるようにするにはどうすればよいですか?