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);という形で、プロシージャを呼び出すが、呼び出しに引数や無名関数を利用できないので、値の受け渡しが厄介である
コメント