从多个 tcp 连接读取数据
Reading data from multiple tcp connection
考虑有 200 个检测器通过 tcp 套接字连接到程序的情况。他们经常发送他们的数据和 我想尽可能有效地处理它。
我可以想到 2 种方法来解决这个问题,但我对 QT 很陌生,所以我不知道哪一种更好,如果有的话。
创建一个线程池,该线程池将运行从 QRunnable(( 派生的 200 个对象,每个对象将由一个套接字和将连接到此套接字信号的插槽组成,以便有关一个检测器的所有数据都将在该对象中处理。(在它的run((方法中会有QEventLoop(
创建 200 个对象,每个对象将由套接字组成,并将这 200 个套接字信号连接到主线程中的一个插槽。因此,它将在一个插槽中处理来自 200 个探测器的数据。
哪种方法可以更好地解释在第一种方法中将创建 200 个 QEventLoop(为每个对象(的事实?
没有必要直接去投票。例如,您可以使用像uvw这样的专用产品。
我认为任何解决方案都可以工作,尽管我绝对建议避免使用每个连接线程的解决方案,因为 200 个线程大约 198 个线程太多了,效率不高。
我这样做的方法是创建一个线程并在该线程内运行一个 select(((或 poll(( 或 epoll(( 或其他(事件循环,以使用非阻塞 I/O 处理那里的 200 个 TCP 连接。 当数据到达该线程时,该线程可以将数据解析为适当的块,然后通过排队信号/插槽连接(或 qApp->postEvent(( 如果您喜欢这样做,请将解析/组装的数据发送到主线程(如有必要(。 (在单独的线程中进行网络将有助于防止 GUI 操作干扰网络性能,反之亦然(
在网络线程中创建~200个QTCPSocket对象(并让网络线程运行Qt标准QEventLoop来处理它们(也可能工作得很好;上次我尝试时,我遇到了一些性能问题,Qt在某些平台上实现网络,但那是在Qt4时代,所以我乐观地认为Qt从那时起提高了他们的实现效率。
在所有情况下,您都不希望线程数超过逻辑处理器内核数。跨线程分布对象。使用旋转事件循环的QRunnable
是相当没有意义的,即使我承认在某人的请求的 SO 答案中演示了它。Eventloop也不便宜 - 每个都需要几千字节的堆栈,至少在我的平台上是这样。因此,最好只使用每个线程具有单个事件循环的QThread
,然后以循环方式在线程之间分发网络对象。
- 如何在ros2中从rosbag2读取数据
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用C++从磁卡读卡器MT188读取数据
- HDF5 简单读取数据集失败
- 嵌套结构,从由空行分隔的文件中读取数据
- 不要从输入队列套接字读取数据
- 从文件中读取数据,操作员>>
- 如何从excel文件中读取数据并存储到变量中?
- C++:从文件中读取x y数据会产生无限循环吗
- 无法通过FT232RL读取数据
- 如何从QNetworkReply读取数据?
- C++ 逐行从文件(包含空格)读取数据
- 通过显示一行星号来创建条形图,该条形图将读取数据的输入文件
- 我们可以从 TXT 文件中读取数据并使用 C 和 C++ 将其保存到 SQL 数据库吗?
- 从多个 tcp 连接读取数据
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- Qt TCP服务器不从客户端读取数据
- 累积从 C++11 中的文件中读取数据的整数
- 从 txt 文件中读取数据的最简单方法
- 从 txt 文件中读取数据的 Getline