私がこれにアプローチする方法は、イベントで使用されるフィールドを所有者に属させるのTidTCPServer
ではなく、カスタムTidContext
の子孫を定義してそのクラスにフィールドを追加することです。
次にContextClass
、サーバー クラスのプロパティをカスタム コンテキストの型に設定するだけです。このようにして、各接続/スレッドは独自のプライベート フィールドを含む独自のカスタム コンテキストを取得します。このようにして、同じフィールドへの同時スレッド アクセスに問題はありません。
異なるコンテキストからアクセスする必要があるオブジェクトのリストがある場合、2 つのオプションがあります。
1) オブジェクトのコピーを作成し、コンテキスト インスタンスごとにプライベート フィールドに格納します。これは、OnConnect
イベントで実行できます。
2) シンクロナイザTIdCriticalSection
、TMultiReadExclusiveWriteSynchronizer
またはセマフォなどを使用して、同時スレッド アクセスからオブジェクトを保護します。
どの方法を使用するかは、個々の状況によって異なります。
vcl コンポーネントを操作する必要がある場合は、メインの vcl スレッドの外では安全に実行できないことに注意してください。そのため、独自の子孫を作成する必要がありますtidnotify
。を使用してこの種の操作を実行すると、vclsynch 操作の途中で をtidsynch
停止するときにデッドロックが発生する可能性があります。tidtcpserver
これは、数年間 Indy を使用して学んだことのほんの一部です。