c++ qt 利用moveToThread的方式创建一个多线程的例子,具体创建两个子线程,一个子线程生成10个随机数,另一个子线程接收10个随机数并排序,主线程分别显示排序之前和排序之后的随机数
时间: 2023-11-13 19:03:21 浏览: 88
以下是一个简单的示例代码,其中第一个子线程用于生成随机数,第二个子线程用于排序:
```c++
#include <QCoreApplication>
#include <QObject>
#include <QThread>
#include <QDebug>
#include <QVector>
class RandWorker : public QObject
{
Q_OBJECT
public:
explicit RandWorker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void generateRand() {
QVector<int> nums;
qsrand(QTime::currentTime().msec());
for (int i = 0; i < 10; ++i) {
nums.append(qrand() % 100);
}
emit generated(nums);
}
signals:
void generated(QVector<int>);
};
class SortWorker : public QObject
{
Q_OBJECT
public:
explicit SortWorker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void sortRand(QVector<int> nums) {
std::sort(nums.begin(), nums.end());
emit sorted(nums);
}
signals:
void sorted(QVector<int>);
};
class MainThread : public QObject
{
Q_OBJECT
public:
explicit MainThread(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void showGenerated(QVector<int> nums) {
qDebug() << "Generated numbers:" << nums;
sortWorker->moveToThread(sortThread);
connect(randWorker, &RandWorker::generated, sortWorker, &SortWorker::sortRand, Qt::QueuedConnection);
connect(sortWorker, &SortWorker::sorted, this, &MainThread::showSorted, Qt::QueuedConnection);
randThread->quit();
randThread->wait();
sortThread->start();
}
void showSorted(QVector<int> nums) {
qDebug() << "Sorted numbers:" << nums;
sortThread->quit();
sortThread->wait();
qApp->quit();
}
signals:
void start();
private:
QThread *randThread = new QThread(this);
QThread *sortThread = new QThread(this);
RandWorker *randWorker = new RandWorker();
SortWorker *sortWorker = new SortWorker();
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MainThread mainThread;
mainThread.start();
mainThread.randWorker->moveToThread(mainThread.randThread);
QObject::connect(mainThread.randThread, &QThread::started, mainThread.randWorker, &RandWorker::generateRand, Qt::QueuedConnection);
QObject::connect(mainThread.randWorker, &RandWorker::generated, &mainThread, &MainThread::showGenerated, Qt::QueuedConnection);
mainThread.randThread->start();
return a.exec();
}
#include "main.moc"
```
在 `RandWorker` 类中,我们定义了 `generateRand()` 方法来生成 10 个随机数,并使用 `generated(QVector<int>)` 信号将其发送到主线程。在 `SortWorker` 类中,我们定义了 `sortRand(QVector<int>)` 方法来对随机数进行排序,并使用 `sorted(QVector<int>)` 信号将排序后的结果发送到主线程。在 `MainThread` 类中,我们定义了 `showGenerated(QVector<int>)` 方法来接收生成的随机数,将 `sortWorker` 移动到 `sortThread` 中,并将 `generated(QVector<int>)` 信号连接到 `sortRand(QVector<int>)` 方法。然后,我们退出 `randThread` 并等待其完成,启动 `sortThread`。在 `showSorted(QVector<int>)` 方法中,我们接收排序后的结果,输出它们,并退出 `sortThread` 和应用程序。最后,在 `main()` 函数中,我们启动 `randThread` 并进入应用程序的事件循环。
请注意,我们使用了 `Qt::QueuedConnection` 参数来确保从不同线程发出的信号和槽都在主线程中执行。此外,我们在 `MainThread` 类的构造函数中创建了 `randThread`、`sortThread`、`randWorker` 和 `sortWorker` 对象,并将它们添加到 `MainThread` 对象的父项中,以确保它们在 `MainThread` 对象被销毁时也被销毁。
阅读全文