2

Borland/EmbarcaderoTClientSocketコンポーネントを使用して、明らかなハンドル リークが発生しました。TThread複数のインスタンスを作成するアプリケーションがあり、それぞれがTClientSocketオブジェクトを動的に作成し、ターゲットに接続していくつかのメッセージを送信してから削除します。その後TThread、インスタンスは ( のFreeOnTerminate = true設定を使用して) 削除されます。これが非効率的であることはわかっていますが、アプリケーションのニーズに完全に適合していますTThread。同時に存在できるインスタンスの最大数は 32 に制限されています。タスクマネージャー経由。問題を切り分けるために、同じ問題をシングル スレッドの意味で適用し、動的にTClientSocketメイン VCL スレッドの 1 つのループ内で終了すると、オブジェクトが再び削除されます。これは、同じハンドル漏れの問題を示します。コンポーネントが非推奨であることはわかっていますし、自分が行っていることが非効率的であることもわかっていますが、ハンドル リークが発生する理由がわかりません。TClientSocketこのハンドル リークをなくすためにオブジェクトを削除する前に、何かする必要があることはありますか?それとも、これはコンポーネントのバグですか? OnConnect OnDisconnect非ブロッキング モードでソケットを使用し、イベント ハンドラをおよびに割り当てていますOnSocketError

4

1 に答える 1

1

TClientSocketメイン スレッドやワーカー スレッドでの使用を含め、長年使用してきましたTClientSocketが、ハンドル リークを見たことはありません。

ただし、TClientSocket非ブロッキング モードがデフォルトであり、そのモードではAllocateHWnd()、ソケット イベントを受信するための非表示のウィンドウを作成するために使用され、スレッド セーフAllocateHWnd()ではありません。実際のコードが表示されない場合、これがワーカー スレッド コードで発生しているリークの原因である可能性があります。これに対する解決策は、単純に、ワーカー スレッドで使用する場合にノンブロッキング モードを使用しないことです。代わりにブロッキング モードで使用してください。とにかく、これはスレッドベースのロジックに適しています。TClientSocket

ただし、メイン スレッド コードで発生しているリークについては説明できません。実際に犯人だとは思えませんTClientSocketが、実際のコードを見なければ、確かに言うのは難しいです。

于 2013-03-13T05:20:11.957 に答える