2015-12-03 34 views
3

我不得不在後臺線程中執行一些繁重的代碼。我不想爲每個這樣的工作人員分類QThread。這是一種正確的方式嗎?在Qt後臺線程中定期執行一些lambda func的正確方法是什麼?

/* 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

你應該在codereview中不要問這個問題 –

回答

2

最初代碼呈現看起來不錯。但是,這取決於您計劃在lambda函數中執行什麼操作以及要使用哪些對象以及它們駐留的位置。

您的lambda函數不捕獲任何變量。如果這是有意的,那麼它應該沒問題。但是,如果您打算使用已在主線程中實例化的對象,那麼當您嘗試在lambda函數中使用它們時,必須仔細考慮它們的線程關聯性(它們在哪個線程上運行) 。

個人而言,我會創建一個單獨的對象,派生自QObject,它創建QTimer和lambda函數,然後將該對象移動到新線程。該對象與主線程之間的通信通過信號和插槽來執行。

相關問題