qt 类中的run线程
在Qt中,QThread类的run()方法是线程的执行入口,它是由QThread内部自动调用的,而不是用户直接调用。
详细解释:
QThread类:
QThread是Qt的线程类,提供了用于多线程操作的接口。我们可以创建QThread对象并将任务放入其中执行。线程的实际执行是通过继承QThread类并重写run()方法,或者使用moveToThread()将一个QObject对象的槽移至子线程中来实现的。
run()方法:
QThread的run()方法是一个虚函数,当你启动线程时,run()方法会被自动调用。通常情况下,我们不会直接调用run()方法,而是使用start()方法来启动线程。调用start()方法后,QThread会在新线程中自动调用run()。
使用QThread的两种方式:
通过继承QThread并重写run()方法:
这种方式比较简单,但也有一些限制,比如在run()方法中不建议进行Qt的UI操作,因为Qt的UI只能在主线程中操作。
class WorkerThread : public QThread
{
public:
void run() override {
// 线程要执行的工作
for (int i = 0; i < 5; ++i) {
qDebug() << "Running in thread";
QThread::sleep(1);
}
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
WorkerThread thread;
thread.start(); // 启动线程,调用run()
thread.wait(); // 等待线程结束
return app.exec();
}
在这个例子中:
你可以看到,run()方法会在调用start()时被自动调用。
start()方法会启动新线程,然后在新线程中自动执行run()方法。
通过moveToThread()将QObject对象移至工作线程:
这是更常用的做法,因为它允许你将现有的QObject对象放入工作线程,而不需要直接继承QThread。
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork() {
for (int i = 0; i < 5; ++i) {
qDebug() << "Working in thread";
QThread::sleep(1);
}
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QThread thread;
Worker worker;
worker.moveToThread(&thread); // 将worker对象移到线程中
QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork); // 连接信号和槽
QObject::connect(&worker, &Worker::finished, &thread, &QThread::quit); // 工作完成后退出线程
QObject::connect(&worker, &Worker::finished, &worker, &QObject::deleteLater); // 工作完成后删除worker
thread.start(); // 启动线程,调用worker的doWork()
thread.wait(); // 等待线程结束
return app.exec();
}
在这个例子中:
我们创建了一个Worker类,并将它移到QThread中运行。
当线程启动时,它会调用doWork()槽方法(而不是直接调用run())。
moveToThread()将worker对象移至QThread中执行任务,doWork()方法在新线程中运行。
总结:
QThread::run():这是QThread类的虚函数,当你调用start()方法时,run()方法会被自动调用,执行你在线程中需要完成的任务。你通常不会直接调用run()方法。
线程启动:
当你使用QThread时,线程通过调用start()方法启动。
线程内的工作是通过重写run()或使用moveToThread()和槽来完成的。
moveToThread():这是将QObject对象移到一个新的线程中,这样你可以在子线程中执行工作,而不需要继承QThread。