QT5 Thread线程继承QThread方式
一.首先分析一下 QTimer Class与 Sleep()函数之间的秘密
QTimer *t = new QTimer(*parent); //创建QTimer 对象
t->start(_time); //计时开始每隔_time时间自动触发&QTimer::timeout信号
t->stop(); //结束计时
Sleep() //windows.h里面的系统延时函数
通过以上方法实现案例:
//button 槽函数
voidWidget::on_buttonstart_clicked()
{
t->start(2000);
Sleep(3000);
qDebug() << "hello world!";
}
//timeout信号处理函数
connect(t,&QTimer::timeout,
[=]()
{
ui->lcd_1->display(++i);
});
分析,在没有Sleep()函数的情况下:
点击开始立马在控制台显示hello world!;每隔2秒lcd显示+1;
有Sleep()的存在后;点击开始程序本质是想每隔2秒lcd显示+1;3秒后控制台显示hello world!;
最终结果是:
点击开始,计时器计时,2秒后,不运行connect();3秒后connect()第一次运行;再过4秒,第二次timeout信号触发,再次运行connect();
最终显示结果为; 过时3秒制台显示hello world!lcd显示 1 再过时1秒显示2 再过2秒显示3 依次经过2秒显示累加1;
二.线程的引入;
如果我们想要的结果是,点击按钮,lcd每一秒显示+1, 3秒控制台回显hello world! 也就是Sleep(3000)显示hello world!并不会去影响到Qtrimer计时;
单独创建线程A,在A线程是实现延时3秒输出hello world!;
1.一个简单的控制台线程例子
新建一个qt控制台程序 自定义一个类 这里就叫class mythread
//mythread.h
#ifndef MYTHREAD_H#define MYTHREAD_H#include
class myThread: publicQThread
{public:
myThread();voidrun(); //声明继承于QThread虚函数 run()
};#endif //MYTHREAD_H
//mythread.cpp
#include"mythread.h"#includemyThread::myThread()
{
}voidmyThread::run()
{
qDebug()<< "hello world!"; //复写QThread类的 run()函数
}
//main.cpp
#include #include"mythread.h" //包涵头文件
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
myThread*thread1 = new myThread; //新建线程对象
thread1->start(); //启动线程
returna.exec();
}
上例启动了一个新线程中输出hello world!
改进上例:
//mythread.h
#ifndef MYTHREAD_H#define MYTHREAD_H#include
class myThread: publicQThread
{public:
myThread();voidrun();
QString name;//添加一个 name 对象
};#endif //MYTHREAD_H
//mythread.cpp
#include "mythread.h"#includemyThread::myThread()
{
}voidmyThread::run()
{
qDebug()<< th