相关疑难解决方法(0)

如何在Qt中创建线程网络服务器?

我正在使用线程telnet服务器(每个连接一个线程),并且无法弄清楚如何摆脱valgrind错误.我把问题缩小到了删除tcpsocket的地方.

我在QThread的run()方法中创建了QTcpSocket:

void TelnetConnection::run()
{
    tcpSocketPtr = new QTcpSocket();  
    if (!tcpSocketPtr->setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocketPtr->error());
        return;
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

当我的应用想断开客户端时,我打电话:

void TelnetConnection::disconnectClient()
{
    tcpSocketPtr->disconnectFromHost();
}
Run Code Online (Sandbox Code Playgroud)

并且在socket断开连接时调用的插槽是:void TelnetConnection :: clientDisconnected()

{
    tcpSocketPtr->deleteLater();  
    TelnetConnection::s_clientCount--;
    QThread::quit();  // Exit ths event loop for this thread
}
Run Code Online (Sandbox Code Playgroud)

所以,我试过1.删除clientDisconnected插槽中的QTcpSocket,但这会导致读/写不稳定.(偶然崩溃)2.在clientDisconnected插槽中删除,但导致内存读/写错误3.在线程的exec循环后删除但仍然导致内存读/写错误4.在线程的exec循环后删除 - 并且全部错误消失了.

从我读到的内容,如果在exec循环终止后调用deletelater,则会在删除线程时运行.因此,虽然这有效,但我认为这不是正确的方法.

我尝试使用"this"作为父级创建QTcpSocket,但由于父级vs这种不匹配错误,我的信号连接失败.(这将允许在线程销毁时删除QTcpSocket).

解决这个问题的正确方法是什么?

c++ sockets qt destructor

2
推荐指数
1
解决办法
2439
查看次数

标签 统计

c++ ×1

destructor ×1

qt ×1

sockets ×1