gpt4 book ai didi

multithreading - 使用 QThreadPool 时如何执行 QObject::moveToThread()?

转载 作者:行者123 更新时间:2023-12-04 12:38:04 28 4
gpt4 key购买 nike

我正在构建一个小型多线程 Web 服务器。 QTcpSockets 在主线程中获取,然后由 QtConcurrent 移交给 QThreadPool,后者最终处理数据并发出答案。

我的问题是套接字是在主线程中创建并在另一个线程中处理的。这会在尝试写入套接字时导致错误:

socket->write(somedata);

QObject: Cannot create children for a parent that is in a different thread. (Parent is QNativeSocketEngine(0x608330), parent's thread is QThread(0x600630), current thread is QThread(0x505f60)



干净的方法是使用
socket->moveToThread(QThread::currentThread()).

然而,这只能在创建对象的线程内调用。此外,套接字将 QTcpServer 对象作为父对象,因此 moveToThread() 无论如何都会失败(父对象不能切换线程)。

如何将对象移动到线程池运行的代码中的 QThread::currentThread() ?或者,如何在创建的线程之外写入套接字?

最佳答案

扩展 QTcpServer , 重新实现 incomingConnection(int socketDescriptor)并将套接字描述符传递给池中的线程。有 QRunnable创建 QTcpSocket从描述符并启动事件循环以接收该套接字的信号。

关于multithreading - 使用 QThreadPool 时如何执行 QObject::moveToThread()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3126145/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com