多线程下tcp收数据,将收到的数据通过Qvetor<T>发送给主线程,其中T是自定义类型。主线程收数据,收到的数据放入QMap<QString,QVctor<T>>中,根据不同的QString和T类型分类数据,比较同一个Map中数据的一致性,思考一下,请用qt写一段代码,代码包含.h和.cpp。
时间: 2024-02-13 19:05:03 浏览: 25
以下是一个多线程TCP通信的例子,其中接收到的数据类型为自定义类型MyData,收到的数据存储在QMap<QString, QVector<MyData>>中,主线程进行数据分类和一致性比较。发送的数据通过QVector<MyData>发送给子线程。
在头文件中定义以下内容:
```cpp
#ifndef TCPCOMMUNICATION_H
#define TCPCOMMUNICATION_H
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>
#include <QVector>
#include <QMap>
struct MyData {
QString name;
int value;
};
class TcpCommunication : public QObject
{
Q_OBJECT
public:
explicit TcpCommunication(QObject *parent = nullptr);
void start();
signals:
void newDataReceived(const QString& name, const QVector<MyData>& data);
public slots:
void newConnection();
void readData();
void sendData(const QVector<MyData>& data);
private:
QTcpServer *m_server;
QTcpSocket *m_socket;
QMap<QString, QVector<MyData>> m_dataReceived;
};
#endif // TCPCOMMUNICATION_H
```
在源文件中实现以下内容:
```cpp
#include "tcpcommunication.h"
TcpCommunication::TcpCommunication(QObject *parent) : QObject(parent)
{
m_server = new QTcpServer(this);
m_socket = new QTcpSocket(this);
connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
connect(m_socket, SIGNAL(readyRead()), this, SLOT(readData()));
connect(m_socket, SIGNAL(disconnected()), m_socket, SLOT(deleteLater()));
}
void TcpCommunication::start()
{
if (m_server->listen(QHostAddress::Any, 1234)) {
qDebug() << "Server started";
} else {
qDebug() << "Server failed to start";
}
}
void TcpCommunication::newConnection()
{
m_socket = m_server->nextPendingConnection();
}
void TcpCommunication::readData()
{
QByteArray data = m_socket->readAll();
QDataStream stream(&data, QIODevice::ReadOnly);
QVector<MyData> newDataVector;
while (!stream.atEnd()) {
MyData newData;
stream >> newData.name >> newData.value;
newDataVector.append(newData);
}
emit newDataReceived(newDataVector);
}
void TcpCommunication::sendData(const QVector<MyData>& data)
{
QByteArray dataToSend;
QDataStream stream(&dataToSend, QIODevice::WriteOnly);
for (const auto& newData : data) {
stream << newData.name << newData.value;
}
m_socket->write(dataToSend);
}
```
在主函数中创建一个TcpCommunication对象,使用QThread将其移动到子线程中运行,并且将接收到的数据放入QMap<QString, QVector<MyData>>中:
```cpp
#include <QCoreApplication>
#include <QThread>
#include "tcpcommunication.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMap<QString, QVector<MyData>> dataMap;
TcpCommunication tcpCommunication;
QThread thread;
tcpCommunication.moveToThread(&thread);
QObject::connect(&thread, SIGNAL(started()), &tcpCommunication, SLOT(start()));
QObject::connect(&tcpCommunication, &TcpCommunication::newDataReceived, [&](const QString& name, const QVector<MyData>& data){
dataMap[name] = data;
});
QObject::connect(&tcpCommunication, SIGNAL(finished()), &thread, SLOT(quit()));
QObject::connect(&tcpCommunication, SIGNAL(finished()), &tcpCommunication, SLOT(deleteLater()));
QObject::connect(&thread, SIGNAL(finished()), &thread, SLOT(deleteLater()));
thread.start();
return a.exec();
}
```