C++ 使用Qt在后台线程中定期执行lambda func的正确方法是什么?
我必须在超时前在后台线程中执行一些繁重的代码。我不想为每一个这样的工作线程子类QThread。这是正确的方式吗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
/* 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中提出此问题,而不是在这里