C++代码实例Qt线程实现两个线程发一包收一包
时间: 2023-12-29 16:10:58 浏览: 105
Qt线程例子
以下是一个简单的示例代码,演示了如何使用Qt实现两个线程之间的通信,一个线程用于发送数据,另一个线程用于接收数据。
```
#include <QtWidgets>
#include <QThread>
// 数据发送线程
class SenderThread : public QThread {
Q_OBJECT
public:
SenderThread(QObject *parent = nullptr) : QThread(parent) {}
signals:
void dataReady(const QByteArray &data);
protected:
void run() override {
// 发送数据
for (int i = 0; i < 10; i++) {
QByteArray data = QByteArray::number(i);
emit dataReady(data);
QThread::msleep(500);
}
}
};
// 数据接收线程
class ReceiverThread : public QThread {
Q_OBJECT
public:
ReceiverThread(QObject *parent = nullptr) : QThread(parent) {}
signals:
void dataReceived(const QByteArray &data);
protected:
void run() override {
// 接收数据
for (int i = 0; i < 10; i++) {
QThread::msleep(500);
emit dataReceived(socket->readAll());
}
}
private:
QTcpSocket *socket = new QTcpSocket(this);
};
// 主窗口
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
// 创建发送线程和接收线程
senderThread = new SenderThread(this);
receiverThread = new ReceiverThread(this);
// 连接信号和槽
connect(senderThread, &SenderThread::dataReady, receiverThread, [=](const QByteArray &data) {
if (receiverThread->socket->state() == QTcpSocket::ConnectedState) {
receiverThread->socket->write(data);
}
});
connect(receiverThread, &ReceiverThread::dataReceived, this, [=](const QByteArray &data) {
qDebug() << data;
});
// 启动线程
senderThread->start();
receiverThread->start();
}
private:
SenderThread *senderThread;
ReceiverThread *receiverThread;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
#include "main.moc"
```
在这个示例中,我们创建了一个 `SenderThread` 类和一个 `ReceiverThread` 类,分别用于发送和接收数据。这两个线程都定义了一个信号,用于在数据准备好时发出通知。在主窗口中,我们创建了这两个线程的实例,并将它们的信号和槽连接起来。这样,当 `SenderThread` 发送数据时,它会发出 `dataReady` 信号,并将数据通过连接的槽函数发送到 `ReceiverThread`。`ReceiverThread` 中的 `dataReceived` 信号会被触发,然后我们就可以对收到的数据进行处理了。
为了模拟网络通信,我们在 `ReceiverThread` 中创建了一个 `QTcpSocket` 实例,并在 `run()` 函数中对它进行了设置。在 `SenderThread` 中,我们将数据通过连接的槽函数发送到 `ReceiverThread`,并在其中检查 `QTcpSocket` 的状态。如果它处于连接状态,我们就通过 `write()` 函数将数据发送到 `ReceiverThread`。最后,我们启动了这两个线程,并且在主窗口中显示出来。
阅读全文