我必须在超时时在后台线程中执行一些繁重的代码。而且我不想为每个这样的 worker 子类化 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 函数,然后将该对象移动到新线程。此对象与主线程上的对象之间的通信是通过信号和槽执行的。
关于c++ - 使用 Qt 在后台线程中定期执行某些 lambda func 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34062424/