子线程TCP通讯的一个解决方式

荒废了三年,想要重振旗鼓!

先说想法,想把tcp放入子线程,然后就会面临一个问题:数据的写入,通过槽函数传进去会面临一个报错:Qt QObject: Cannot create children for a parent that is in a different thread.

还有一种报错:QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread;

唉,如果不是大佬,估计会像我一样上网各种查,有一种我还没有尝试,重写socket的write;

废话不多说,我用的拉姆达表达式,解决的。上代码,各位大佬指点一下:

void T_Thread_TCP_Server::run()
{
    qDebug() << "启动线程:" << QThread::currentThreadId();

    t_server = new QTcpServer();

    //监听制定端口
    if(!t_server->listen(QHostAddress::Any, port_)){
        qDebug() << t_server->errorString();
        return ;
    }
    qDebug() << "监听成功!";

    connect(t_server, &QTcpServer::newConnection,[this](){
        t_socket = t_server->nextPendingConnection();
        qDebug() << "线程1:" << QThread::currentThreadId();

        connect(t_socket,&QTcpSocket::readyRead,[this](){
            QByteArray bte;
            bte = t_socket->readAll();
            qDebug() << "bte = " << bte;
            emit Rec_Data(bte);
            qDebug() << "线程2:" << QThread::currentThreadId();
        });

        qDebug() << "已连接!";
        qDebug() << "线程3:" << QThread::currentThreadId();

        connect(t_socket, &QTcpSocket::disconnected, this,[](){
            qDebug() << "连接已断开!";
        });
        connect(this, &T_Thread_TCP_Server::Send_Data,t_socket,[=](){

            t_socket->write(bte_);
            qDebug() << "写入数据 : " << bte_;
            qDebug() << "线程4:" << QThread::currentThreadId();
        } );

    });
    exec();
}

这是我弄完ok的,如果有遇到我同类困扰问题的,就细看

connect(this, &T_Thread_TCP_Server::Send_Data,t_socket,[=](){});

大体就是这个,但是对于这个拉姆达,我的理解还不够 ,目前这样用是过了,但是自己的知识盲点还没有过。

切记,不可一知半解,切记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值