1

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

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

4

2 に答える 2

1

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

于 2013-09-14T16:20:26.540 に答える
0

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

これらの変更により、サーバーは 5,000 を超えるリクエストを同時に処理でき、CPU 使用率もそれほど多くありませんでした。

于 2013-09-15T10:29:06.073 に答える