c++ qt 利用moveToThread的方式创建一个多线程的例子,具体创建两个子线程,一个子线程生成10个随机数,另一个子线程接收10个随机数并排序,主线程显示排序之前和排序时候的随机数
时间: 2023-11-13 11:03:21 浏览: 83
一个C++多线程例子
4星 · 用户满意度95%
以下是一个简单的示例代码:
```c++
#include <QCoreApplication>
#include <QObject>
#include <QThread>
#include <QDebug>
#include <QRandomGenerator>
class RandomNumberGenerator : public QObject
{
Q_OBJECT
public:
explicit RandomNumberGenerator(QObject *parent = nullptr) : QObject(parent)
{
qRegisterMetaType<QList<int>>("QList<int>");
}
signals:
void generated(QList<int> numbers);
public slots:
void generateNumbers()
{
QList<int> numbers;
for (int i = 0; i < 10; i++) {
numbers << QRandomGenerator::global()->bounded(100);
}
emit generated(numbers);
}
};
class NumberSorter : public QObject
{
Q_OBJECT
public:
explicit NumberSorter(QObject *parent = nullptr) : QObject(parent)
{
qRegisterMetaType<QList<int>>("QList<int>");
}
signals:
void sorted(QList<int> numbers);
public slots:
void sortNumbers(QList<int> numbers)
{
std::sort(numbers.begin(), numbers.end());
emit sorted(numbers);
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
RandomNumberGenerator generator;
NumberSorter sorter;
QThread thread1;
QThread thread2;
generator.moveToThread(&thread1);
sorter.moveToThread(&thread2);
QObject::connect(&generator, &RandomNumberGenerator::generated, &sorter, &NumberSorter::sortNumbers);
QObject::connect(&sorter, &NumberSorter::sorted, [](QList<int> numbers) {
qDebug() << "Sorted numbers: " << numbers;
});
thread1.start();
thread2.start();
QTimer::singleShot(0, &generator, &RandomNumberGenerator::generateNumbers);
return a.exec();
}
#include "main.moc"
```
在该示例中,我们创建了两个子线程:`thread1`和`thread2`,分别用于生成随机数和排序随机数。我们创建了两个类`RandomNumberGenerator`和`NumberSorter`,分别用于生成随机数和排序随机数。这两个类都是`QObject`的子类,因此可以使用`moveToThread`方法将它们移到不同的线程中。
在`RandomNumberGenerator`类中,我们发出一个名为`generated`的信号,该信号包含一个生成的随机数列表。在`NumberSorter`类中,我们定义了一个名为`sortNumbers`的槽,该槽接收一个随机数列表,并对其进行排序。一旦排序完成,我们发出一个名为`sorted`的信号,该信号包含排序后的随机数列表。
在主函数中,我们创建了`RandomNumberGenerator`和`NumberSorter`的实例,并将它们移到不同的线程中。我们还通过连接`generated`信号和`sortNumbers`槽,将这两个类连接起来。最后,我们启动了两个线程,并使用`QTimer::singleShot`方法在`RandomNumberGenerator`类中生成随机数。
当程序运行时,`sorted`信号会在排序完成后发出,并在主线程中显示排序后的随机数。
阅读全文