考虑通过tcp套接字连接到程序的200个检测器的情况。他们经常发送他们的数据和 我想尽可能有效地处理它。
我可以想到这个问题的两种方法,但我在QT中很新,所以我不知道哪一个更好,如果有的话。
创建一个将运行从QRunnable()派生的200个对象的线程池,每个对象将包含一个插槽和将连接到此套接字信号的插槽,以便处理有关一个探测器的所有数据。那一个对象。 (在它的run()方法中将有QEventLoop)
创建200个对象,每个对象将由套接字组成,并将这200个套接字信号连接到主线程中的一个插槽。因此它将在一个插槽中处理来自200个探测器的数据。
哪种方法可以更好地解决这样一个事实,即在第一种方法中将创建200个QEventLoops(对于每个对象)?
答案 0 :(得分:0)
没有必要直接进入epoll。例如,您可以使用像uvw这样的专用内容。
答案 1 :(得分:0)
我认为任何解决方案都可以工作,但我绝对建议避免使用每个连接的线程解决方案,因为200个线程大约有198个线程太多而且效率不高。
我这样做的方法是创建一个线程并在该线程内运行select()(或poll()或epoll()或其他)事件循环来处理那里的200个TCP连接,使用非阻塞I / O。当数据到达该线程时,该线程可以将数据解析为适当的块,然后通过排队信号/插槽连接(或qApp-> postEvent())将解析/汇编的数据发送到主线程(如果需要)如果你喜欢这样做的话)。 (在单独的线程中进行联网将有助于防止GUI操作干扰网络性能,反之亦然)
在网络线程中创建~200个QTCPSocket对象(并让网络线程运行Qt标准QEventLoop来处理它们)也可能运行良好;我最后一次尝试使用Qt在某些平台上实现网络时遇到了一些性能问题,但那是在Qt4时代,所以我很乐观地认为Qt从那时起已经提高了它们的实现效率。
答案 2 :(得分:0)
在所有情况下,您都不需要比逻辑处理器核心更多的线程。跨线程分发对象。使用一个旋转事件循环的QRunnable
是毫无意义的,即使我承认在某个人的请求中以SO答案进行演示。 Eventloops也不便宜 - 每个都需要几千字节的堆栈,至少在我的平台上。因此,最好只使用每个线程有一个eventloop的QThread
,然后以循环方式在线程之间分配网络对象。