荒废了三年,想要重振旗鼓!
先说想法,想把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,[=](){});
大体就是这个,但是对于这个拉姆达,我的理解还不够 ,目前这样用是过了,但是自己的知识盲点还没有过。
切记,不可一知半解,切记。