qt create 将接收消息和处理消息分为两个线程进行,举例通过信号和槽,在槽函数中将接受的消息保存,在启动一个线程处理保存的所有消息,基于Linux环境试试写一个例子
时间: 2024-03-21 16:37:51 浏览: 53
C++ Qt创建多线程的2种方式:重写run函数,使用moveToThread【应该早点知道的】源码示例
好的,下面是一个基于Linux环境的例子:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <QObject>
#include <QCoreApplication>
#include <QTcpSocket>
std::mutex mtx;
std::condition_variable cv;
std::queue<std::string> messages;
class TcpClient : public QObject
{
Q_OBJECT
public:
TcpClient(QObject *parent = nullptr) : QObject(parent)
{
socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::readyRead, this, &TcpClient::onReadyRead);
}
public slots:
void connectToServer(const QString &address, int port)
{
socket->connectToHost(address, port);
}
private slots:
void onReadyRead()
{
std::lock_guard<std::mutex> lock(mtx);
messages.push(socket->readAll().toStdString());
cv.notify_one();
}
private:
QTcpSocket *socket;
};
void messageHandler()
{
while (true)
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []() { return !messages.empty(); });
std::string message = messages.front();
messages.pop();
lock.unlock();
// 处理消息
std::cout << "Received message: " << message << std::endl;
}
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
TcpClient tcpClient;
tcpClient.connectToServer("127.0.0.1", 1234);
std::thread handlerThread(messageHandler);
app.exec();
handlerThread.join();
return 0;
}
#include "main.moc"
```
这个例子中,我们先定义了一个 TcpClient 类,用于连接到服务器并接收消息。在 `onReadyRead` 槽函数中,我们将接收到的消息保存到一个消息队列中,并通过条件变量 `cv` 通知消息处理线程。
消息处理线程 `messageHandler` 会不断地从消息队列中取出消息,并进行处理。在这个例子中,我们只是简单地输出接收到的消息。
需要注意的是,在 `main` 函数中,我们需要先启动消息处理线程,再调用 `app.exec()` 来启动 Qt 的事件循环。当程序结束时,我们需要等待消息处理线程结束,再返回。
阅读全文