TClientSocket
マルチスレッドC++Windowsアプリケーション内で非ブロッキングモードでBorlandsコンポーネントを利用しようとしています。複数のスレッド(から派生したクラスTThread
)を作成しており、それぞれが独自のTClientSocket
オブジェクトを作成しています。次に、スレッドクラスのメンバー関数を割り当てて、ソケットのOnConnect
、OnDisconnect
およびイベントのイベントハンドラーとして機能させます。OnSocketError
ここで私が抱えている問題は、TClientSocket::Open()
関数内から関数を呼び出すたびにTThread::Execute()
、OnConnect
イベントが発生しないことです。ただし、関数が呼び出されるOpen()
前にVCLスレッドから関数を呼び出すTThread::Execute()
と、すべてのイベントが発生し、スレッドとソケットの組み合わせを自由に使用できます。今、私はそれを言うドキュメントで何も読んでいませんTClientSocket
スレッド内で使用する場合、非ブロッキングモードで使用するべきではありませんが、このクラスを使用しようとしている方法に概念的に何か問題があるように思われます。Borlandのドキュメントはこの件に関して非常に貧弱であり、これらのコンポーネントは現在非推奨になっているため、信頼できる情報を入手するのは困難です。非推奨になっていますが、私が持っているBuilder 6パッケージには代替手段がないため、これらを使用する必要があります。TThread
正しい/間違った使用方法とノンブロッキングTClientSocket
の組み合わせがあるかどうか誰かに教えてもらえますか?VCLスレッドの一部として使用する際に問題が発生したことはなく、TServerSocketを使用する際に問題が発生したこともありません。また、一部のイベントが発生しない理由を本当に理解できません。
1 に答える
2
TClientSocket
非ブロッキングモードでは、内部で非表示のウィンドウを使用してソケットイベントを受信します。でノンブロッキングを使用する場合は、TClientSocket
これらのメッセージをソケットのウィンドウにディスパッチするためにTThread
、メソッド内にメッセージループを実装する必要があります。TThread::Execute()
また、ウィンドウベースであるということは、ソケットメッセージが実際にソケットウィンドウを作成するスレッドに送信されることも意味するためTClientSocket
、メソッドの内部からを開いていることを確認する必要がありますTThread::Execute()
。
ところで、BCB6は代替品であるIndy8に同梱されています。また、最新バージョンのIndyや、ICSやSynapseなどの別のサードパーティライブラリをインストールすることもできます。
于 2013-03-12T00:08:32.560 に答える