Delphi/C++Builder Indy10 のスレッド内からSynchronize
Indy10 コンポーネントのスレッド内から VCLを操作しようとすると、例外発生
Indy9 の AThread みたいなのを取得しようにも、そういったメンバは見つからない
Indy10の場合、
の方法があるらしい
最初の例(TIdHttpServer の OnCommandGet イベントで、フォームを作成する例)
二つ目は
という形で、プロシージャを呼び出すが、呼び出しに引数や無名関数を利用できないので、値の受け渡しが厄介である
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);
コメント