C++ 使用Qt在后台线程中定期执行lambda func的正确方法是什么?

C++ 使用Qt在后台线程中定期执行lambda func的正确方法是什么?,c++,qt,lambda,qthread,qtimer,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

我必须在超时前在后台线程中执行一些繁重的代码。我不想为每一个这样的工作线程子类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();

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

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


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

您应该在codereview中提出此问题,而不是在这里