2013-09-06 3 views
0

Windows 7의 Qt 4.7에서 RPC 서버를 개발 중입니다. 동시에 여러 요청을 처리하기 위해 요청이 모두 별도의 스레드에서 실행됩니다 (기능이 차단 될 수 있으므로). 내가 QTcpServer에서 상속과 incomingConnection 기능을 다시 구현, 그것은 다음과 같습니다QTcpServer의 메모리 누수가 다른 스레드의 conections에 있음

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를 상속 할 때 다른 것을 무료로해야합니까?

답변

1

레이스/정의되지 않은 호출 순서와 관련된 문제 일 수 있습니다. RpcServerConnection::finish()deleteLater() 슬롯과 스레드의 quit() 슬롯에 모두 연결됩니다. 스레드의 quit 슬롯이 먼저 입력되면 스레드는 이벤트 루프에서 즉시 종료되어 지연된 삭제에 대해 수행 할 수 있습니다.

대신 :

connect(client, SIGNAL(finish()), thread, SLOT(quit())); 

시도 :

connect(client, SIGNAL(destroyed()), thread, SLOT(quit()));