1

IndyのTIdTCPServer(D2009、Indy 10)を使用してクライアントアプリケーションと通信します。OnExecuteメソッドで、タスクを作成してキューに入れます。ワーカースレッドがタスクを実行し、送信キューに入れます。次に、送信キューは応答をクライアントに送信します。

送信スレッドで、サーバーのコンテキストリストをループし、タスクに格納されているIPおよびポート情報に一致するコンテキストを探します。次に、アクセス違反をスローすることがあるいくつかの送信コマンドに従います(送信中にコンテキストが破棄されると思います)。

ここで質問に移ります。応答を送信する前にコンテキストが閉じられていないことを確認するにはどうすればよいですか?Indyで別のスレッドから送信することは可能ですか、それともすべてをIndyスレッドで行う必要がありますか?

4

1 に答える 1

2

コンテキストはリストから削除されるまで解放されないため、データを送信している間は TIdTCPServer.Contexts リストをロックしたままにしてみてください。欠点は、1 つの送信の進行中にクライアントの接続/切断/送信が処理されないことです。

または、送信コードを try/except ブロックでラップし、発生する可能性のあるエラーを無視します。

または、コードを書き直して送信キューをコンテキスト自体に移動できる場合は、それが最善です。はい。その後、OnExecute イベント ハンドラーは定期的にキューをチェックし、利用可能な場合はデータを送信できます。同時に複数のクライアントに対して送信データの準備ができている場合、送信をシリアル化する必要がないため、これはパフォーマンスにも役立ちます。

于 2009-10-07T23:38:10.440 に答える