使用 QTimer 在主執行緒上執行程式碼
void DispatchToMainThread(std::function<void()> callback)
{
// any thread
QTimer* timer = new QTimer();
timer->moveToThread(qApp->thread());
timer->setSingleShot(true);
QObject::connect(timer, &QTimer::timeout, [=]()
{
// main thread
callback();
timer->deleteLater();
});
QMetaObject::invokeMethod(timer, "start", Qt::QueuedConnection, Q_ARG(int, 0));
}
當你需要從執行緒更新 UI 元素時,這非常有用。請記住回撥引用的任何內容的生命週期。
DispatchToMainThread([]
{
// main thread
// do UI work here
});
可以調整相同的程式碼以在執行 Qt 事件迴圈的任何執行緒上執行程式碼,從而實現簡單的分派機制。