是的,可以使用moveToThread()
方法将一个对象移动到另一个线程中,并且在该线程中执行多个任务。例如:
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject* parent = nullptr);
public slots:
void task1();
void task2();
private:
bool m_running;
};
MyObject::MyObject(QObject* parent)
: QObject(parent)
, m_running(false)
{
}
void MyObject::task1()
{
m_running = true;
// 执行任务1
m_running = false;
}
void MyObject::task2()
{
m_running = true;
// 执行任务2
m_running = false;
}
然后,在主线程中创建一个QThread
对象,并将MyObject
对象移动到该线程中:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QThread thread;
MyObject obj;
// 将obj对象移动到新的线程中
obj.moveToThread(&thread);
// 启动线程
thread.start();
// 连接信号和槽函数
QObject::connect(&thread, &QThread::finished, &obj, &QObject::deleteLater);
// 在新的线程中执行任务
QMetaObject::invokeMethod(&obj, "task1");
while (obj.isRunning()) {
qApp->processEvents();
QThread::msleep(10);
}
QMetaObject::invokeMethod(&obj, "task2");
while (obj.isRunning()) {
qApp->processEvents();
QThread::msleep(10);
}
// 结束线程
thread.quit();
thread.wait();
return app.exec();
}
在上面的例子中,我们创建了一个MyObject
对象,并将其移动到了新的线程中。然后,在主线程中使用QMetaObject::invokeMethod()
方法调用了两个任务函数。这两个任务函数会在新的线程中执行,而不会阻塞主线程。当任务完成后,我们可以通过检查m_running
属性来判断任务是否已经完成。