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

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

Indy10の場合、

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

の方法があるらしい

最初の例(TIdHttpServer の OnCommandGet イベントで、フォームを作成する例)
  1. uses IdSync  
  2.   
  3.     TVclSync = class(TIdSync)  
  4.     protected  
  5.         procedure DoSynchronize; override;  
  6.     public  
  7.         FormCaption: string;  
  8.     end;  
  9.   
  10. implementation  
  11.   
  12. { TVclSync }  
  13. procedure TVclSync.DoSynchronize;  
  14. var Form: TForm;  
  15. begin  
  16.     Form := TForm.Create(Application);  
  17.     Form.Caption := FormCaption;  
  18.     Form.Show;  
  19. end;  
  1. procedure TCapRcevSetupForm.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);  
  2. var VclSync: TVclSync;  
  3. begin  
  4.     VclSync := TVclSync.Create;  
  5.     try  
  6.         VclSync.FormCaption := AContext.Binding.IP;  
  7.         VclSync.Synchronize;  
  8.     finally  
  9.         VclSync.Free;  
  10.     end;  
  11. end;  
二つ目は
  1. procedure Form1.Hoge;  
  2. begin  
  3.   
  4. end;  
  5.   
  6. TIdSync.SynchronizeMethod(Hoge);  
という形で、プロシージャを呼び出すが、呼び出しに引数や無名関数を利用できないので、値の受け渡しが厄介である

コメント