qt多线程通信
时间: 2023-06-28 11:07:52 浏览: 106
qt object多线程- 串口通信
5星 · 资源好评率100%
Qt多线程通信有多种方式,以下是其中的几种:
1. 信号与槽:在主线程中定义一个信号,然后在子线程中使用槽函数处理信号。这种方式可以实现线程之间的安全通信,避免了共享变量带来的问题。示例代码如下:
```
// 在主线程中定义信号
class MyThread : public QThread {
Q_OBJECT
public:
MyThread(QObject *parent = nullptr) : QThread(parent) {}
signals:
void mySignal(int value);
protected:
void run() override {
// 子线程中使用槽函数处理信号
QObject::connect(this, &MyThread::mySignal, this, [this](int value) {
qDebug() << "Received signal in thread" << QThread::currentThreadId() << "with value" << value;
});
exec();
}
};
// 在主线程中发送信号
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
MyThread thread;
thread.start();
// 发送信号
QObject::connect(&thread, &MyThread::started, [] {
qDebug() << "Sending signal in thread" << QThread::currentThreadId();
emit mySignal(42);
});
return a.exec();
}
```
2. 使用信号槽队列:在子线程中定义一个QObject对象,然后将其移动到主线程中。这样,子线程可以通过调用该对象的信号槽函数来与主线程进行通信。示例代码如下:
```
// 在子线程中定义QObject对象
class Worker : public QObject {
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {}
signals:
void mySignal(int value);
public slots:
void doWork() {
// 子线程中发送信号
emit mySignal(42);
}
};
// 在主线程中移动QObject对象到主线程中
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread thread;
Worker worker;
worker.moveToThread(&thread);
// 在主线程中连接信号槽
QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);
QObject::connect(&worker, &Worker::mySignal, [] (int value) {
qDebug() << "Received signal in thread" << QThread::currentThreadId() << "with value" << value;
});
thread.start();
return a.exec();
}
```
3. QMetaObject::invokeMethod:可以在主线程中使用该方法来调用子线程中的槽函数。示例代码如下:
```
// 在子线程中定义槽函数
class Worker : public QObject {
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork(int value) {
qDebug() << "Received value" << value << "in thread" << QThread::currentThreadId();
}
};
// 在主线程中调用槽函数
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread thread;
Worker worker;
worker.moveToThread(&thread);
thread.start();
// 在主线程中调用槽函数
QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection, Q_ARG(int, 42));
return a.exec();
}
```
以上是Qt多线程通信的几种方式,根据具体需求选择合适的方式。
阅读全文