Qt的线程类QThread提供了常用方法,需要集成后使用。提供了线程入口函数run,这是一个受保护的虚函数,需要重新实现自定义代码。下面创建一个小的场景,线程的开始与停止受到主界面的按钮控制,一旦线程开始运行,则发出超时信号(时间间隔对外提供方法设置),主线程接收超时信号并进行处理,让LCD显示部件加1。
步骤1.创建主界面类,并设计ui界面如下:
2.新建c++类继承自QThread
a.新建类继承时通常选择继承自QWidget,等待创建好之后在修改。添加QThread头文件;修改从哪个类继承,在代码部分我已做了标注。
b.重新run函数,run函数重写成每隔固定的时间间隔发出一个信号。
c.对外提供一个可以修改这个时间间隔的方法
3.主线程中创建子线程类对象
a.使用按钮控制子线程的开始与暂停
b.接收子线程的信号,并进行处理,让LCD每次收到信号加1。
在信号与槽 一节提到过connect函数第五个参数的作用,采用Qt::BlockingQueuedConnection参数让子线程阻塞,直到主线程处理完毕,也就是同步处理,区别于Qt::QueuedConnection参数等控制权回到主线程在执行处理。这是需要注意的一点,实际应用中应结合具体的应用需求选择合适的参数。
效果与代码部分一致,每2秒发送一次信号
main
#include "widget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
widget.h主线程
#ifndef WIDGET_H #define WIDGET_H #include#include "mythread.h" QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private slots: void doProcessTimeOut(); void on_startBtn_clicked(); void on_stopBtn_clicked(); private: Ui::Widget *ui; myThread *thr; int index; }; #endif // WIDGET_H
widget.cpp主线程
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); index = 0; thr = new myThread(this); connect(thr,SIGNAL(signalTimeOut()),this,SLOT(doProcessTimeOut())); } Widget::~Widget() { delete ui; } void Widget::doProcessTimeOut() { index++; if(index==101) { index=0; } ui->lcdNumber->display(index); } void Widget::on_startBtn_clicked() { //可修改时间间隔 thr->setTimeSecend(2);//修改每两秒加1 thr->start(); } void Widget::on_stopBtn_clicked() { thr->terminate(); }
mythread.h子线程
#ifndef MYTHREAD_H #define MYTHREAD_H #include#include //添加头文件 class myThread : public QThread//继承修改1 { Q_OBJECT public: explicit myThread(QWidget *parent = nullptr);//构造函数参数,可不改 void setTimeSecend(int sec); protected: void run(); signals: signalTimeOut(); private: int time_sec; }; #endif // MYTHREAD_H
mythread.cpp
#include "mythread.h" myThread::myThread(QWidget *parent) : QThread(parent)//继承修改2 { time_sec = 1; } void myThread::run() { while (1) { sleep(time_sec); emit signalTimeOut(); } } void myThread::setTimeSecend(int sec) { time_sec = sec; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)