在Qt使用QTcpServer和QTcpSocket及多线程时安全释放内存的几个注意点

  1. QTcpServer释放时,会释放所有与之相关的QTcpSocket,从而断开所有与客户端的连接,并触发QTcpSocket的disconnected()信号,从而触发断开时的响应函数。因此只需要释放一个QTcpServer即可。避免重复释放,会报错的。
  2. 不必过多考虑QTcpServer和QTcpSocket的信号槽connect()函数的disconnect()操作,在QTcpServer和QTcpSocket被释放时,connect函数会被自动释放。
  3. 但是当QTcpServer和QTcpSocket未被释放时,注意不要重复定义connect()函数,这样会导致多个重复的信号槽被创建。
  4. 在新建一个类时,可将QTcpSocket通过指针传递进该类,但是注意不必在该类中考虑传递进来的QTcpSocket的内存释放,在主函数中释放即可。
  5. 释放通常使用 if(XXX) delete XXX; 的语句。
  6. QTcpServer释放前需要先close。QTcpSocket释放前需要先abort。
  7. 多线程的内存释放,特别要注意当在多线程中使用到while死循环时,注意避免这样使用死循环。
    while(1)
    {
    }
    
    因为这样的死循环,会导致线程无法推出。应当添加一个bool标志符,如下。
    bool run_flag = true;
    while(run_flag)
    {
    }
    
    当需要退出该线程时,先结束死循环,而后退出,如下。
    run_flag = false;
    this->exit(0);
    
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QT线程中使用QTcpSocket需要注意以下几个问题: 1. 多线程操作同一个QTcpSocket对象会导致数据错乱。每个线程应该有自己的QTcpSocket对象来读写数据。 2. 在多线程中,需要使用信号和槽机制进行线程间通信。当数据准备好时,发送一个信号通知主线程或其他线程进行处理。 3. 在QTcpSocket的readyRead()信号中,应该先获取可读数据的大小,然后再读取数据,避免读取不完整的数据。在读取数据之前,可以使用waitForReadyRead()函数等待数据的到来。 4. 在QTcpSocket的write()函数中,应该保证一次性写入所有数据,避免发送不完整的数据。如果数据过大,可以分段发送。 下面是一个简单的示例代码: ```cpp // 多线程读取数据 class TcpThread : public QThread { Q_OBJECT public: explicit TcpThread(QObject *parent = 0); void run(); void setSocket(qintptr descriptor); signals: void error(QTcpSocket::SocketError socketError); void readyRead(QByteArray data); void disconnected(); private: QTcpSocket *socket; }; TcpThread::TcpThread(QObject *parent) : QThread(parent) { socket = new QTcpSocket(this); connect(socket, SIGNAL(readyRead()), this, SLOT(readData())); connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); } void TcpThread::run() { if (!socket->setSocketDescriptor(descriptor)) { emit error(socket->error()); return; } exec(); } void TcpThread::setSocket(qintptr descriptor) { this->descriptor = descriptor; } void TcpThread::readData() { QByteArray data; while (socket->bytesAvailable()) { int len = socket->bytesAvailable(); data.append(socket->read(len)); } emit readyRead(data); } void TcpThread::disconnected() { emit disconnected(); } // 主线程处理数据 class TcpServer : public QTcpServer { Q_OBJECT public: explicit TcpServer(QObject *parent = 0); void incomingConnection(qintptr socketDescriptor); void processData(QByteArray data); signals: void dataReady(QByteArray data); private: QList<TcpThread*> threads; }; TcpServer::TcpServer(QObject *parent) : QTcpServer(parent) { } void TcpServer::incomingConnection(qintptr socketDescriptor) { TcpThread *thread = new TcpThread(this); connect(thread, SIGNAL(readyRead(QByteArray)), this, SLOT(processData(QByteArray))); connect(thread, SIGNAL(disconnected()), thread, SLOT(deleteLater())); thread->setSocket(socketDescriptor); thread->start(); threads.append(thread); } void TcpServer::processData(QByteArray data) { emit dataReady(data); } // 使用示例 TcpServer server; connect(&server, SIGNAL(dataReady(QByteArray)), this, SLOT(processData(QByteArray))); server.listen(QHostAddress::Any, port); ``` 这个示例代码中,创建了一个TcpThread类用于多线程读取数据,主线程通过信号和槽机制处理数据。在TcpThread类中,使用了readyRead()信号和readData()槽函数来读取数据,并在读取完成后,通过readyRead()信号通知主线程处理数据。在主线程中,使用incomingConnection()函数创建TcpThread对象,并通过dataReady()信号处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼月半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值