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

标签 c++ qt lambda qthread qtimer

我必须在超时时在后台线程中执行一些繁重的代码。而且我不想为每个这样的 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/

相关文章:

qt - 中心QML ListView高亮显示的项目

c++ - 如何为 ostream 创建 lambda?

ruby - 如何从 Ruby 中的子类覆盖 lambda 变量?

c++ - vector有推回时间限制吗

c++ - 如何将 Switch Qml 添加到 qt widgets?

c++ - 如何用SDL输出多种声音?

java - 是否收集了 lambda 垃圾?

c++ - Eclipse CDT-有没有办法在开始新的启动之前终止以前运行的启动?

c++ - 如何获得 QDockArea 的大小?

c++ - 使 TAB 按下去下一个字段