QThread. Выполнение функции по таймеру не наследуя QThread

Как реализовать запуск функции по таймеру в отдельном потоке через QThread?

Я видел несколько примеров, но во всех QThread наследовался и создавался новый класс.

Можно ли обойтись без наследования QThread?


Ответы (1 шт):

Автор решения: Maxim Timakov
class Worker : public QObject
{
Q_OBJECT
public /* methods */:
    Worker(): QObject{nullptr}
    {
        connect(timer, &QTimer::timeout,
                this,  &Worker::onTimer);
        // TODO: установить интервал
    }
public slots:
    void onTimer ()
    {
        // код обработки события
    }

    void start()
    {
        timer.start ();
    }

private /* members */:
   QTimer timer;
}

/// .....
auto t = new QThread{this};
auto w = new Worker;

w->moveToThread(t);

connect(t, &QThread::started,
        w, &Worker::start);
// TODO: подключить удаление w при остановке потока.

t->start();

Так как QTimer наследуется от QObject, то теоретически возможно использование объекта QTimer в качестве воркера.

auto thread = new QThread;
auto timer = new QTimer;

timer->setInterval(1234ms);

timer->moveToThread(thread);

connect(thread, &QThread::started, timer, &QTimer::start);
connect(thread, &QThread::finished, timer, &QTimer::deleteLater);

connect(timer, &QTimer::timeout, []() {
    // код обработки события таймера
});


thread->start();
→ Ссылка