1.概要
1.要点
QThread::sleep(3); // 休眠3秒
worker.moveToThread(&thread);
QObject::connect(&thread, &QThread::started, [&worker]() {
QTimer::singleShot(0, &worker, &Worker::doWork);
});
线程启动的时候进化事件循环,但通常这个不是必要的,因为一定会进入事件循环
void run() override {
qDebug() << "Thread started:" << QThread::currentThread();
exec(); // 进入事件循环
}
2.相关链接
c++,一个线程,对外提供一个槽函数,当这个槽函数被调用的时候,线程休眠一段时间-优快云博客
qt 我想让一个udp线程休眠一段时间,休眠后只处理最新的数据,休眠期间的缓存数据我不要了-优快云博客 qt 一个线程让另一个线程休眠,可以吗-优快云博客
使用 Qt 的 moveToThread 方法创建的线程,如何让线程休眠-优快云博客
如何让一个使用 Qt 的 moveToThread 方法创建的udp线程休眠,且休眠期间的缓存数据自动丢弃-优快云博客
qt,一个线程,对外提供一个槽函数,当这个槽函数被调用的时候,线程休眠一段时间-优快云博客
2.内容
在Qt中,你可以使用QThread类来创建一个新线程,并在该线程中提供一个槽函数。当槽函数被调用时,可以使线程休眠一段时间。你可以使用QThread::sleep()或QThread::msleep()来实现休眠效果。
以下是一个简单的示例,展示了如何创建一个自定义线程类,并在其中实现一个槽函数,当该槽函数被调用时,线程会休眠一段时间:
#include <QCoreApplication>
#include <QThread>
#include <QObject>
#include <QDebug>
#include <QTimer>
class Worker : public QObject {
Q_OBJECT
public slots:
void doWork() {
qDebug() << "Work started in thread:" << QThread::currentThread();
QThread::sleep(3); // 休眠3秒
qDebug() << "Work finished in thread:" << QThread::currentThread();
}
};
class MyThread : public QThread {
Q_OBJECT
protected:
void run() override {
qDebug() << "Thread started:" << QThread::currentThread();
exec(); // 进入事件循环
}
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
MyThread thread;
Worker worker;
worker.moveToThread(&thread);
QObject::connect(&thread, &QThread::started, [&worker]() {
QTimer::singleShot(0, &worker, &Worker::doWork);
});
thread.start();
return a.exec();
}
#include "main.moc"
代码解释:
- Worker类:
- 继承自
QObject
,并定义一个槽函数doWork()
。 - 在
doWork()
槽函数中,使用QThread::sleep(3)
使线程休眠3秒,并打印开始和结束的消息。
- 继承自
- MyThread类:
- 继承自
QThread
,并重写run()
方法。 - 在
run()
方法中,调用exec()
使线程进入事件循环。
- 继承自
- main函数:
- 创建
QCoreApplication
对象。 - 创建
MyThread
对象和Worker
对象。 - 将
Worker
对象移动到MyThread
线程中(使用moveToThread
)。 - 当线程启动时(
QThread::started
信号),使用QTimer::singleShot
来在线程中调用Worker
的doWork
槽函数。 - 启动线程。
- 创建
注意事项:
- 不要直接在主线程中调用
QThread::sleep()
,这会导致主线程冻结。 - 使用
moveToThread
将Worker
对象移动到新线程中,以确保槽函数在新线程中执行。 - 确保线程在适当的时候进入事件循环(通过调用
exec()
)。
这个示例展示了如何在Qt中创建一个新线程,并在该线程中实现一个带有休眠功能的槽函数。你可以根据需要调整休眠时间和槽函数的实现逻辑。