2014/02/27

Delphi/C++Builder Indy10 のスレッド内からSynchronize

Indy10 コンポーネントのスレッド内から VCLを操作しようとすると、例外発生
Indy9 の AThread みたいなのを取得しようにも、そういったメンバは見つからない

Indy10の場合、

  • IdSync ユニットの TIdSync からクラスを生成して、DoSynchronize に定義した内容を Synchronize メソッドで呼び出すという方法
  • TIdSync の SynchronizeMethod メソッドにプロシージャを渡して実行

の方法があるらしい

最初の例(TIdHttpServer の OnCommandGet イベントで、フォームを作成する例)
uses IdSync

    TVclSync = class(TIdSync)
    protected
        procedure DoSynchronize; override;
    public
        FormCaption: string;
    end;

implementation

{ TVclSync }
procedure TVclSync.DoSynchronize;
var Form: TForm;
begin
    Form := TForm.Create(Application);
    Form.Caption := FormCaption;
    Form.Show;
end;
procedure TCapRcevSetupForm.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var VclSync: TVclSync;
begin
    VclSync := TVclSync.Create;
    try
        VclSync.FormCaption := AContext.Binding.IP;
        VclSync.Synchronize;
    finally
        VclSync.Free;
    end;
end;
二つ目は
procedure Form1.Hoge;
begin

end;

TIdSync.SynchronizeMethod(Hoge);
という形で、プロシージャを呼び出すが、呼び出しに引数や無名関数を利用できないので、値の受け渡しが厄介である

0 件のコメント: