1

进程(用 C++ 编写)充当服务器,QTcpServer 类用于构建服务器。对于每个新的传入连接,它都会产生一个新线程并使用新的套接字描述符创建一个 QTcpSocket 对象,该对象负责该套接字上的所有读/写。为每个连接生成一个新线程可能听起来很糟糕,但我无能为力,所以请耐心等待。所以,问题是,当服务器上的套接字数量超过 2500 时,它就会崩溃。我在控制台上收到以下消息: QEventDispatcher: Failed to create QEventDispatcherWin32 internal window: 1158 Qt: INTERNALL ERROR: failed to install GetMessage hook

我尝试了一些东西,首先我检查了我们是否可以创建这么多线程,因为每个连接都有专用线程。没有问题,我可以创建超过 5000 个线程。其次,我在 MSDN 上找到了一些东西, http: //msdn.microsoft.com/en-us/library/aa560610 (v=bts.20).aspx 它也没有帮助。请建议。

4

2 回答 2

1

每个线程对其堆栈的默认分配为 1 MB,因此对于 2500 个线程,您的线程堆栈已超过进程可用的 2 GB 内存。对于这么多的套接字,每个套接字一个线程的设计是站不住脚的。

于 2013-09-14T16:20:26.540 回答
0

东西很少,一开始是为 64 位平台编译可执行文件。它有助于创建大量线程。其次,放弃使用QTcpSocket,从头开始编写所有函数。我从 QTcpSocket 寻求的不同之处在于包含“Winsock2.h”的方式。在包含头文件之前定义了以下宏。#define FD_SETSIZE 5000

通过这些更改,服务器可以同时处理超过 5K 的请求,并且 CPU 使用率也不高。

于 2013-09-15T10:29:06.073 回答