Я работаю над приложением Qt. Там я использую два потока, один для графического интерфейса и один для обработки.
У меня есть рабочий класс, в котором QTimer является классом-членом.
.h файл:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QThread>
class Worker : public QObject
{
Q_OBJECT
public:
Worker();
QTimer t;
public slots:
void process();
void startWorker();
};
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QThread workerThread;
Worker wt;
};
#endif // MAINWINDOW_H
cpp-файл
#include "mainwindow.h"
#include <QDebug>
#include <iostream>
Worker::Worker() : t(this)
{
connect(&t, SIGNAL(timeout()), this, SLOT(process()));
}
void Worker::process()
{
std::cout << "triggering timer" << std::endl;
}
void Worker::startWorker()
{
t.start(1000);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
wt.moveToThread(&workerThread);
qDebug() << "worker thread " << wt.thread();
qDebug() << "timer thread " << wt.t.thread();
connect(&workerThread, SIGNAL(started()), &wt, SLOT(startWorker()));
connect(&workerThread, &QThread::finished, &workerThread, &QObject::deleteLater);
workerThread.start();
}
MainWindow::~MainWindow()
{
workerThread.quit();
workerThread.wait();
}
Я могу начать тему без ошибок. Однако, когда я закрываю приложение, я получаю предупреждающее сообщение.
QObject::killTimer: Timers cannot be stopped from another thread
QObject::~QObject: Timers cannot be stopped from another thread
Если QTimer является дочерним элементом рабочего класса и был перемещен в поток, почему Qt жалуется на его остановку из другого потока? Примечание. Я добавил журналы для печати идентификатора потока, и в обоих случаях он выводит одинаковое значение:
worker thread QThread(0x72fdf0)
timer thread QThread(0x72fdf0)
Может кто-нибудь объяснить? Я не понимаю, что здесь происходит
заранее спасибо