我必须通过超时在后台线程中执行一些繁重的代码。而且我不想为每个这样的工人继承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();
答案 0 :(得分:2)
最初提供的代码看起来不错。但是,这取决于您计划在lambda函数中执行的操作以及您将要使用的对象以及它们驻留的位置。
您的lambda函数不捕获任何变量。如果是这样的话,那应该没问题。但是,如果您计划使用已经在主线程上实例化的对象,那么当您尝试在lambda函数中使用它们时,您将不得不仔细考虑它们的线程关联(它们正在运行的线程)。
就个人而言,我创建了一个单独的对象,派生自QObject,它创建了QTimer和lambda函数,然后将该对象移动到新线程。该对象与主线程上的对象之间的通信是通过信号和插槽进行的。