qt多线程官方示例代码
时间: 2023-07-21 19:12:32 浏览: 84
Qt多线程实例
3星 · 编辑精心推荐
以下是Qt官方文档中的一个多线程示例代码,可以参考:
```cpp
#include <QtConcurrent/QtConcurrent>
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QThread>
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString ¶meter) {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
public:
Controller() {
connect(&m_watcher, &QFutureWatcher<QString>::finished, this, &Controller::handleResults);
connect(&m_worker, &Worker::resultReady, &m_watcher, &QFutureWatcher<QString>::progressValue);
connect(&m_worker, &Worker::resultReady, &m_watcher, &QFutureWatcher<QString>::cancel);
connect(&m_worker, &Worker::resultReady, this, &Controller::handleResults);
QThreadPool::globalInstance()->setMaxThreadCount(1);
}
void start(const QString ¶meter) {
QFuture<QString> future = QtConcurrent::run(&m_worker, &Worker::doWork, parameter);
m_watcher.setFuture(future);
}
signals:
void resultsReady(const QString &result);
private slots:
void handleResults() {
QFuture<QString> future = m_watcher.future();
if (future.isCanceled())
qDebug() << "Canceled!";
else
emit resultsReady(future.result());
}
private:
Worker m_worker;
QFutureWatcher<QString> m_watcher;
};
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
Controller controller;
QObject::connect(&controller, &Controller::resultsReady, &app, [&](const QString &result) {
qDebug() << "Result:" << result;
app.quit();
});
controller.start("Hello, world!");
return app.exec();
}
#include "main.moc"
```
这个示例程序中,我们创建了一个 `Worker` 类,里面有一个槽函数 `doWork`,用于执行昂贵或阻塞的操作,然后通过 `resultReady` 信号返回结果。我们还创建了一个 `Controller` 类,用于控制 `Worker` 的运行。在 `Controller` 中,我们使用 `QtConcurrent::run` 函数来启动 `Worker` 的 `doWork` 方法,返回一个 `QFuture` 对象,然后将该 `QFuture` 对象传递给 `QFutureWatcher` 对象,以便在后台线程中跟踪其进度并在完成时发送 `resultsReady` 信号。在主线程中,我们将 `Controller` 的 `resultsReady` 信号连接到 `QCoreApplication` 的 `quit` 槽,以便在结果准备好时退出应用程序。
阅读全文