有时会遇到这样的情况,想让这个子类放在另一个线程中运行,并以定时器,每间隔一定时间进入这个子类的循环中运行,这时使用QT不是单纯地将此类采用moveToThread就可以搞定的,我直接举个简单的例子,可以从这个例子中使用
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "Test.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); void initMainWindow(); signals: void startTest(); private: Ui::MainWindow *ui; Test* test; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "MainWindow.h" #include "ui_MainWindow.h" #include<QThread> #include<QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), test(nullptr), ui(new Ui::MainWindow) { ui->setupUi(this); qDebug()<<"MainwindowThread:"<<QThread::currentThreadId()<<endl; initMainWindow(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::initMainWindow() { test = new Test; test->start(); }
一个简单的带定时器的类Test ,Test.h
#ifndef TEST_H #define TEST_H #include <QObject> #include<QTimer> #include<QThread> class Test : public QThread { Q_OBJECT public: explicit Test(QObject *parent = nullptr); void run(); void LoopTime(); private: QTimer *time; signals: public slots: }; #endif // TEST_H
Test .cpp
#include "Test.h" #include<QDebug> #include<QThread> Test::Test(QObject *parent) : QThread(parent), time(nullptr) { qDebug()<<"Test:"<<QThread::currentThreadId()<<endl; moveToThread(this); } void Test::run() { time = new QTimer; time->setInterval(1000); connect(time,&QTimer::timeout,this,&Test::LoopTime); time->start(); exec(); } void Test::LoopTime() { qDebug()<<"looptimeThread:"<<QThread::currentThreadId()<<endl; }
最后运行时显示:
MainwindowThread: 0x46a0
Test: 0x46a0
looptimeThread: 0x2c68
looptimeThread: 0x2c68
looptimeThread: 0x2c68
looptimeThread: 0x2c68
looptimeThread: 0x2c68
looptimeThread: 0x2c68
这样在另一个线程中定时响应
如下图设计界面
而Mainwindow.cpp
Test.cpp
这时运行,点击二个按键会显示:
可以看出通过按键调用时是主线程,它的线程与Test类不在一个线程
这时就要问了如何让其也在一个线程中;这时将所有操作都通过线程间的消息进行传递;
Mainwindow.cpp 改为
Test.h改为
Test.cpp改为
然后运行结果 :
即当按键时也在另一个线程内操作。