-1

このコードでは、Connectで見られるように、AContext.Dataは何かで満たされています

TmyTThreadList = class(TThreadList)
  id: integer;
end;

var unique_id:integer;

procedure TfrmTestIdTCPServer.IdTCPServerConnect(AContext: TIdContext);
 begin
  CS.Enter;
  try
    inc(unique_id);
  finally
    CS.Leave;
  end;

   AContext.Data := myTThreadList.Create;
   list := myTThreadList(AContext.Data).LockList;
   try
     myTThreadList(AContext.Data).id := my_unique_id;
     list.Add(myTThreadList(AContext.Data));
   finally
     myTThreadList(AContext.Data).UnlockList;
   end;
 end;

次に、切断時に、コーダーはここでAcontext.Data<>nilをチェックしています。

procedure TfrmTestIdTCPServer.IdTCPServerDisconnect(AContext: TIdContext);
 var
 begin
   if AContext.Data <> nil then
   begin

問題は、なぜ彼がnilをチェックしているのかということです。

ありがとう。

編集:

これを求めているのは、同じことを行うと、onExecuteがAContext.Dataにアクセスし、場合によっては(同時に多くのクライアントを接続しているときに)AContext.Dataが空になると、アクセス違反が表示されるためです。

4

2 に答える 2

0

OnConnectイベント ハンドラーでキャッチされない例外が発生した場合OnDisconnectでも、イベントを呼び出すことができます。それまでに例外が発生した場合は、TThreadList.Create割り当てAContext.Dataられません。

于 2012-11-26T22:12:40.920 に答える
0

元のプログラマーは、さまざまな理由で Data が nil かどうかを確認できます。それを実際に知る唯一の方法は、なぜそうなったかを尋ねることです。

私が考えられるのは次のとおりです。

  • 任意の接続に対して新しいDataオブジェクトが作成された場合でも、このオブジェクトは、接続の有効期間中に、他の数または理由で解放される可能性があります。たとえば、そのサーバー コンポーネントの OnExecute イベント ハンドラーで、そこに格納されたデータの結果として、またはクライアントまたは他の外部ソースからの要求によって。
  • 接続の存続期間中に実行されるコードは、元のプログラマーの制御範囲外にある可能性があります。そのため、Data オブジェクトがまだそこにあるかどうかを知る方法は他にありません。たとえば、コンポーネントの作成者はその種のテストを行う必要があります。チームで作業するライブラリ プログラマ。
  • 元のコーダーは防御的なプログラマーのようなものであり、Data オブジェクトがそこにあるはずであることを知っている場合でもチェックを適用していますが、それが存在することを確認し、偶発的なアクセス違反を防ぐためです。

ご存じのように、Indy は Data オブジェクトには触れませんが、Task インスタンスの Destroy シーケンスで触れます。

TIdTask.Dataのドキュメントには次のように記載されています。

タスクの実行中に使用される値を持つユーザー指定のオブジェクト。Data は、タスクの実行中に使用できる値を持つユーザー指定のオブジェクト インスタンスを表す TObject プロパティです。

Create でタスクを作成した後、オブジェクト インスタンスを Data に割り当てる必要があります。

Data プロパティは TIdTask インスタンスによって所有され、Destroy で解放されます。

また、データが Indy 自体によって解放された場合についても言及していません。

オブジェクトを新しい接続に割り当て、サーバーでそれを使用していくつかの作業を行い、クライアントから複数の接続を行うテストを行いました。さまざまな数千の接続の後、それぞれの AContext に接続された正しい Data オブジェクトを保持することに失敗した人はいませんOnDisconnect だけでなく、OnExecute イベントにも呼び出します。

于 2012-11-26T06:23:45.337 に答える