如何将类中定时器内容放入另一个线程

有时会遇到这样的情况,想让这个子类放在另一个线程中运行,并以定时器,每间隔一定时间进入这个子类的循环中运行,这时使用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改为

然后运行结果 :

 即当按键时也在另一个线程内操作。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值