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