RuL*_*ViC 1 qt multithreading qthread qt5 qtimer
我正在研究 Qt 应用程序。在那里我使用了两个线程,一个用于 GUI,另一个用于处理。
我有一个工人类,它有 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
Run Code Online (Sandbox Code Playgroud)
.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();
}
Run Code Online (Sandbox Code Playgroud)
我可以毫无错误地启动线程。但是,当我关闭应用程序时,我收到警告消息。
QObject::killTimer: Timers cannot be stopped from another thread
QObject::~QObject: Timers cannot be stopped from another thread
Run Code Online (Sandbox Code Playgroud)
如果 QTimer 是 worker 类的孩子并且它已移至线程,为什么 Qt 抱怨从不同的线程停止它?注意:我添加了日志来打印线程 ID,并且在两种情况下都输出相同的值:
worker thread QThread(0x72fdf0)
timer thread QThread(0x72fdf0)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?我不明白这里发生了什么
提前致谢
我终于能够通过以下方式修复错误:
谢谢大家