5

TIDTCPServerコンポーネントを使用しています。私が理解したように、イベントServerTCPExecute(AContext: TIdContext) は同期されていません。それを同期する最良の方法は何ですか?データをメインスレッドに送信して、回答をフォーマットするために戻す必要があります。

Indy10.5.8.0を使用しています。

方法1

同期されていない関数からアプリケーションにデータを渡すためにクリティカルセクションを処理する必要があるのは、このようなものですか?

var data:string;
.
.
.
procedure MainThreadProcedure;
begin
  ...
end;
.
.
.
procedure IdTCPServerExecute(AContext: TIDContext);
var tmp: string;
begin
.
.
.
EnterCriticalSection(cs);
data:= tmp;
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MainThreadProcedure);
LeaveCriticalSection(cs);
end;
4

2 に答える 2

12

正しい方法は、TIdSyncIndyの内部スレッドに直接アクセスする代わりに、Indyのクラスを使用することです。例:

uses
  ..., IdSync;

type
  TMySync = class(TIdSync)
  protected
    procedure DoSynchronize; override;
  public
    data: string; 
  end;

procedure TMySync.DoSynchronize;
begin
  // this runs in the main thread
  // use data as needed...
end;

procedure IdTCPServerExecute(AContext: TIDContext); 
var
  tmp: string;
  sync: TMySync; 
begin 
  tmp := ...;
  sync := TMySync.Create;
  try 
    sync.data := tmp; 
    sync.Synchronize;
  finally
    Sync.Free;
  end; 
end;

同期するかどうかにかかわらず、同期には注意てください。サーバーがメインスレッドと同期しようとしているときにメインスレッドがサーバーを非アクティブ化しようとすると、メインスレッドとサーバーの両方がデッドロックします。TIdSyncTThread.Synchronize()

于 2012-08-29T19:15:00.393 に答える
0

私のアプリケーションでは、次のコードを使用しています。

procedure MainThreadProcedure;
begin
  ...
end;
.
.
.
procedure IdTCPServerExecute(AContext: TIDContext);
begin
  TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MainThreadProcedure);
end;

のメインスレッド変数にアクセスする必要がある場合は、必ずクリティカルセクションまたは他の同期オブジェクトを使用してください。ServerTCPExecute

于 2012-08-29T10:08:50.793 に答える