diff --git a/src/blackmisc/worker.h b/src/blackmisc/worker.h index 1b07d25f3..dae73e789 100644 --- a/src/blackmisc/worker.h +++ b/src/blackmisc/worker.h @@ -60,19 +60,18 @@ namespace BlackMisc */ //! @{ template - void singleShot(int msec, QThread *target, F task) + void singleShot(int msec, QThread *target, F &&task) { - auto *timer = new QTimer; + QSharedPointer timer(new QTimer, [](QObject *o) { QMetaObject::invokeMethod(o, "deleteLater"); }); timer->setSingleShot(true); - timer->moveToThread(target); - auto trace = getStackTrace(); - QObject::connect(timer, &QTimer::timeout, [ = ]() + timer->moveToThread(target->thread()); + QObject::connect(timer.data(), &QTimer::timeout, target, [trace = getStackTrace(), task = std::forward(task), timer] { static_cast(trace); + static_cast(timer); task(); - timer->deleteLater(); }); - QMetaObject::invokeMethod(timer, "start", Q_ARG(int, msec)); + QMetaObject::invokeMethod(timer.data(), "start", Q_ARG(int, msec)); } template void singleShot(int msec, QThread *target, QObject *owner, F task)