我正在Windows 7的Qt 4.7中开发RPC服务器。 为了同时参加多个执行,每个请求都在一个单独的线程中运行(因为函数可能阻塞)。我从QTcpServer继承并重新实现了incomingConnection函数,它看起来像这样:
void RpcServer::incomingConnection(int socketDescriptor){
QThread *thread = new QThread();
RpcServerConnection *client = new RpcServerConnection(socketDescriptor);
client->moveToThread(thread);
connect(thread, SIGNAL(started()), client, SLOT(init()));
connect(client, SIGNAL(finish()), thread, SLOT(quit()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
RpcServerConnection托管数据交换。 init方法如下所示:
void RpcServerConnection::init(){
qDebug() << "ServerSocket(" << QThread::currentThreadId() << "): Init";
clientConnection = new QTcpSocket();
clientConnection->setSocketDescriptor(socketDescriptor);
connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readFromSocket()));
connect(clientConnection, SIGNAL(disconnected()), this, SLOT(deleteLater()));
connect(this, SIGNAL(finish()), this, SLOT(deleteLater()));
}
一旦收到所有数据并发送响应,就会发出完成信号。 调试我可以看到所有线程和套接字都被删除了。但是,进程内存随着每个新连接而增加,并且在结束时不会释放...
从QTcpServer继承时,是否必须释放其他内容?
答案 0 :(得分:1)
问题可能出在种族/未定义的呼叫顺序上。 RpcServerConnection::finish()
已连接到其deleteLater()
广告位和线索的quit()
广告位。如果首先输入线程的quit
槽,则线程将立即从事件循环终止,然后才能完成有关延迟删除的任何操作。
而不是:
connect(client, SIGNAL(finish()), thread, SLOT(quit()));
尝试:
connect(client, SIGNAL(destroyed()), thread, SLOT(quit()));