使用Qt在后台线程中定期执行一些lambda函数的正确方法是什么?

时间:2015-12-03 09:38:04

标签: c++ qt lambda qthread qtimer

我必须通过超时在后台线程中执行一些繁重的代码。而且我不想为每个这样的工人继承QThread。这是一种正确的方法吗?

/* inside QObject subclass */  
auto thread = new QThread(this);  
auto timer = new QTimer(nullptr);  
timer->moveToThread(thread);  
timer->setInterval(1000);  
connect(timer, &QTimer::timeout, [](){  
    /* do lambda work */  
});  
connect(thread, SIGNAL(started()), timer, SLOT(start()));  
connect(thread, &QThread::destroyed, timer, &QTimer::deleteLater);  
thread->start();

1 个答案:

答案 0 :(得分:2)

最初提供的代码看起来不错。但是,这取决于您计划在lambda函数中执行的操作以及您将要使用的对象以及它们驻留的位置。

您的lambda函数不捕获任何变量。如果是这样的话,那应该没问题。但是,如果您计划使用已经在主线程上实例化的对象,那么当您尝试在lambda函数中使用它们时,您将不得不仔细考虑它们的线程关联(它们正在运行的线程)。

就个人而言,我创建了一个单独的对象,派生自QObject,它创建了QTimer和lambda函数,然后将该对象移动到新线程。该对象与主线程上的对象之间的通信是通过信号和插槽进行的。