/ / 2.5k以上のTCPポートとスレッドを開いた後に終了するプロセス-c ++、windows、qt、visual-c ++、tcp

開かれた後に終了するプロセス> 2.5k TCPポートとスレッド - c ++、windows、qt、visual-c ++、tcp

プロセス(C ++で記述された)は、サーバーでは、QTcpServerクラスを使用してサーバーを構築します。新しい着信接続ごとに、新しいスレッドが生成され、新しいソケット記述子でQTcpSocketオブジェクトが作成されます。これにより、そのソケットでのすべての読み取り/書き込みが処理されます。接続ごとに新しいスレッドを生成するのは悪いように聞こえるかもしれませんが、それを支援することはできません。 そのため、問題は、サーバーのソケット数が2500を超えるとクラッシュすることです。コンソールに次のメッセージが表示されます。 QEventDispatcher:QEventDispatcherWin32内部ウィンドウの作成に失敗しました:1158 Qt:内部エラー:GetMessageフックのインストールに失敗しました

いくつか試してみましたが、まず作成できるか確認しましたすべての接続に専用のスレッドがあるため、これらの多くのスレッドかどうか。問題ありません。5000以上のスレッドを作成できます。 次に、MSDNで何かを見つけました。 http://msdn.microsoft.com/en-us/library/aa560610(v=bts.20).aspx また、役に立たなかった。提案してください。

回答:

回答№1は1

各スレッドには、デフォルトで1 MBの割り当てがあります。そのため、2500スレッドでは、スレッドスタックがプロセスで使用可能な2 GBのメモリを超えています。 1ソケットあたり1スレッドの設計は、非常に多くのソケットでは受け入れられません。


回答№2の場合は0

いくつかのものがありましたが、最初は64ビットプラットフォーム用の実行可能ファイル。多数のスレッドを作成するのに役立ちました。第二に、QTcpSocketを使用して削除し、すべての関数をゼロから作成しました。私がQTcpSocketから求めている違いは、「Winsock2.h」が含まれている方法です。ヘッダーファイルを含める前に、以下のマクロを定義しました。 #define FD_SETSIZE 5000

これらの変更により、サーバーは5Kを超える要求を同時に処理でき、CPU使用率もそれほど高くありませんでした。