qt 如何运用多线程,实现udp的通信,在代码中即能发送信息,也能接收信息,新建的线程用来接收信息,请给出代码
时间: 2024-03-26 16:40:20 浏览: 152
下面是一个示例代码,演示如何使用Qt的多线程和UDP通信实现发送和接收数据:
```cpp
#include <QtWidgets>
#include <QUdpSocket>
#include <QThread>
class UdpThread : public QThread
{
Q_OBJECT
public:
UdpThread(QObject *parent = nullptr) : QThread(parent) {}
void run() override {
// 创建UDP套接字
QUdpSocket udpSocket;
udpSocket.bind(QHostAddress::Any, 8888);
while (!isInterruptionRequested()) {
// 接收数据
QByteArray data;
QHostAddress sender;
quint16 senderPort;
if (udpSocket.hasPendingDatagrams()) {
data.resize(udpSocket.pendingDatagramSize());
udpSocket.readDatagram(data.data(), data.size(), &sender, &senderPort);
emit receivedData(data);
}
}
}
signals:
void receivedData(const QByteArray &data);
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
// 创建UDP套接字
udpSocket = new QUdpSocket(this);
// 创建新的线程,用于接收数据
udpThread = new UdpThread(this);
connect(udpThread, &UdpThread::receivedData, this, &MainWindow::handleReceivedData);
udpThread->start();
// 创建界面
QWidget *centralWidget = new QWidget(this);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
textEdit = new QTextEdit(centralWidget);
layout->addWidget(textEdit);
QLineEdit *lineEdit = new QLineEdit(centralWidget);
layout->addWidget(lineEdit);
QPushButton *sendButton = new QPushButton(tr("Send"), centralWidget);
layout->addWidget(sendButton);
setCentralWidget(centralWidget);
// 发送数据
connect(sendButton, &QPushButton::clicked, this, [this, lineEdit](){
QByteArray data = lineEdit->text().toUtf8();
udpSocket->writeDatagram(data, QHostAddress::LocalHost, 8888);
});
}
~MainWindow() override {
udpThread->requestInterruption();
udpThread->wait();
}
private slots:
void handleReceivedData(const QByteArray &data) {
QString text = QString::fromUtf8(data);
textEdit->append(text);
}
private:
QUdpSocket *udpSocket;
UdpThread *udpThread;
QTextEdit *textEdit;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
#include "main.moc"
```
这个示例代码中,`UdpThread` 类继承自 `QThread`,用于接收 UDP 数据。在 `UdpThread::run()` 方法中,创建了一个 `QUdpSocket` 对象,并循环接收数据。每当有数据到达时,发射 `receivedData` 信号,将数据传递给主线程进行处理。
在 `MainWindow` 类中,创建了一个 `QUdpSocket` 对象,用于发送 UDP 数据。同时,创建了一个 `UdpThread` 对象,用于接收 UDP 数据。在界面中,有一个文本框用于显示接收到的数据,一个输入框用于输入要发送的数据,一个按钮用于发送数据。当用户点击按钮时,将输入框中的文本转换成 `QByteArray` 类型,并使用 `QUdpSocket::writeDatagram()` 方法发送数据。
注意,在程序退出时,需要停止接收线程。这里使用了 `QThread::requestInterruption()` 方法和 `QThread::wait()` 方法来停止线程的执行。
阅读全文