生成一个Qt多线程的示例代码
时间: 2023-05-21 09:06:36 浏览: 115
QT的多线程编程示例
以下是一个简单的 Qt 多线程示例代码,用于计算1到100000的和:
```cpp
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork()
{
int sum = 0;
for (int i = 1; i <= 100000; i++) {
sum += i;
}
emit resultReady(sum);
}
signals:
void resultReady(int result);
};
class Controller : public QObject
{
Q_OBJECT
public:
Controller()
{
Worker* worker = new Worker;
QThread* thread = new QThread;
worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResult);
thread->start();
}
public slots:
void handleResult(int result)
{
qDebug() << "Result:" << result;
qApp->quit();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Controller controller;
return a.exec();
}
```
该示例代码创建了两个类:`Worker` 和 `Controller`。`Worker` 类用于在后台线程中计算1到100000的和,并将结果通过信号发送回主线程,`Controller` 类用于控制多线程的启动和数据的处理。
在 `Controller` 的构造函数中,我们创建了一个 `Worker` 实例并将其移动到一个新 `QThread` 实例中。然后,我们设置 `Worker` 实例开始执行 `doWork()` 槽函数,该函数执行计算并通过 `resultReady(int result)` 信号将结果发送回主线程。我们还在 `Controller` 中连接了 `resultReady` 信号,处理接收到的结果并关闭应用程序。
请注意,要从另一个线程安全地调用 `QObject` 派生类的函数,需要在它们所属的对象上执行函数,而不是直接调用函数。由于我们正在从 `Worker` 对象中调用 `resultReady` 信号,而另一个线程并没有在该对象之前创建,因此我们需要将 `Worker` 对象移动到另一个线程中。在 `Worker` 对象传递到新线程之后,我们可以通过连接对象信号和槽来与其进行通信。
提供上述示例代码,希望对您有所帮助。
阅读全文