qt 多线程进行数据交互
时间: 2023-11-16 21:08:49 浏览: 39
在 Qt 中,可以使用信号和槽机制来实现多线程之间的数据交互。具体来说,可以将一个对象的信号连接到另一个对象的槽,这样当信号发出时,槽函数就会被调用。在多线程的情况下,可以将信号连接到一个槽函数,这个槽函数会在一个独立的线程中执行。
以下是一个简单的例子,展示了如何在两个线程之间传递数据:
```cpp
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {}
signals:
void resultReady(const QString &result);
public slots:
void doWork() {
// 在这里执行耗时的操作...
QString result = "Hello, world!";
emit resultReady(result);
}
};
class Controller : public QObject
{
Q_OBJECT
public:
Controller(QObject *parent = nullptr) : QObject(parent) {
Worker *worker = new Worker(this);
QThread *thread = new QThread(this);
worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResult);
connect(worker, &Worker::finished, thread, &QThread::quit);
connect(worker, &Worker::finished, worker, &Worker::deleteLater);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
thread->start();
}
public slots:
void handleResult(const QString &result) {
qDebug() << "Received result:" << result;
}
};
```
在这个例子中,`Worker` 类代表了一个执行耗时操作的线程。它有一个 `resultReady` 信号,当操作完成时,会发射这个信号,并传递一个结果字符串。`Controller` 类代表了主线程,它会创建一个 `Worker` 对象,并将它移动到一个新的线程中。然后,它将 `resultReady` 信号连接到一个槽函数 `handleResult`,这个槽函数会在主线程中执行,用来处理操作的结果。
在 `Controller` 类的构造函数中,还需要对新线程和 `Worker` 对象进行一些初始化操作。首先,需要将 `Worker` 对象移动到新线程中,这样它的槽函数就会在新线程中执行。然后,需要将新线程的 `started` 信号连接到 `Worker` 对象的 `doWork` 槽函数,这样当新线程启动时,`Worker` 对象的 `doWork` 函数就会被调用。最后,还需要将一些信号和槽连接起来,以确保线程能够正确地退出和销毁。
通过这种方式,就可以在不同的线程之间传递数据了。当 `Worker` 对象发射 `resultReady` 信号时,`handleResult` 槽函数就会在主线程中执行,并用来处理操作的结果。