我有一个简单的多线程应用程序,其工作方式类似于 Qt 网站上的示例 “Threaded Fortune Server Example”。
当我的QTCPServer接收到传入连接时,我创建一个QRunnable任务,传递socketDescriptor然后将其提交给QThreadPool:
void Server::incomingConnection(qintptr socketDescriptor)
{
Task *task = new Task(socketDescriptor, this);
this->m_pool->start(task);
}
然后在 Task 方法中run()
创建套接字:
void Task::run()
{
QTcpSocket tcpSocket;
if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocket.error());
return;
}
...
}
但是,我 从 Qt Doc中阅读了关于QTCPServer的incomingConnection方法的那些注释
注意:如果在重新实现此方法时创建了另一个套接字,则需要通过调用 addPendingConnection() 将其添加到 Pending Connections 机制中。
注意:如果您想在另一个线程中将传入连接作为新的 QTcpSocket 对象处理,您必须将 socketDescriptor 传递给另一个线程并在那里创建 QTcpSocket 对象并使用其 setSocketDescriptor() 方法。
所以,我的问题是:
- 如何将另一个线程创建的套接字添加到服务器的挂起连接?
- 这是一个必要的操作吗?
谢谢,