QT中使用线程可以提高工作效率。

要使用线程要经过一下四个步骤:

(1)先创建一个c++ class文件,记得继承Thread,创建步骤如下:

a、第一步

b、第二步

(2)自定义一个run函数,以后启动线程的时候,程序就会跳转到run函数中

void run();

(3)初始化线程

HDThread mythread = new HDThread();

(4)启动线程

mythread->start();

下面来看看线程使用的具体列子:

线程头文件hdthread.h:

 #ifndef HDTHREAD_H
#define HDTHREAD_H
#include <QThread>
#include <QLabel>
#include <QMutex> class HDTHread : public QThread
{
public:
HDTHread(QMutex* mtex,QObject *parent = );
void run();//自定义的run函数
void setLabel(QLabel *lb);
private:
QLabel *label;
QMutex *mutex; //互斥锁
}; #endif // HDTHREAD_H

主函数的头文件threadqt.h

 #ifndef THREADQT_H
#define THREADQT_H #include <QMainWindow>
#include <hdthread.h>
#include <writefile.h>
#include <QMutex>
#include <QSemaphore> namespace Ui {
class ThreadQt;
} class ThreadQt : public QMainWindow
{
Q_OBJECT public:
explicit ThreadQt(QWidget *parent = );
~ThreadQt(); //定义静态的信号类
static QSemaphore *sp_A;
static QSemaphore *sp_B;
private slots:
void on_pushButton_clicked(); private:
Ui::ThreadQt *ui; HDTHread *thread; //hdtread类,里面继承了线程
WriteFile *writethread;
QMutex mutex;//定义互斥锁类 }; #endif // THREADQT_H

源文件hdthread.cpp:

#include "hdthread.h"
#include <QDebug>
#include <threadqt.h>
HDTHread::HDTHread(QMutex *mtex, QObject *parent):QThread(parent)//构造函数,用来初始化
{
this->mutex = mtex;
}
void HDTHread::setLabel(QLabel *lb)
{
this->label = lb;
} void HDTHread::run() //启动线程时执行的函数
{
while(true)
{ qint64 data = qrand()%; //取随机数
//this->mutex->lock();//上锁
ThreadQt::sp_A->acquire();//请求信号
this->label->setText(QString::number(data));
sleep();
ThreadQt::sp_B->release();//释放信号
//this->mutex->unlock();//解锁 qDebug()<<"hello Qt"<<data;
}
}

源文件threadqt.cpp

#include "threadqt.h"
#include "ui_threadqt.h" //初始化静态变量
QSemaphore *ThreadQt::sp_A = NULL;
QSemaphore *ThreadQt::sp_B = NULL; ThreadQt::ThreadQt(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ThreadQt)
{
ui->setupUi(this);
//创建信号对象
sp_A = new QSemaphore();
sp_B = new QSemaphore(); } ThreadQt::~ThreadQt()
{
delete ui;
} void ThreadQt::on_pushButton_clicked()
{
thread = new HDTHread(&mutex); //初始化线程
thread->setLabel(ui->label);
thread->start();//开启线程 writethread = new WriteFile(&mutex);
writethread->setLabel(ui->label);
writethread->start();
}

大家也看到了,此处的线程也用到了互斥锁(信号量)保证线程读写数据时不出现错误,这里大家可以看一下具体实现的代码

this->mutex->lock();//上锁
ThreadQt::sp_A->acquire();//请求信号
this->label->setText(QString::number(data));
sleep(1);
ThreadQt::sp_B->release();//释放信号
this->mutex->unlock();//解锁

qt中线程的使用方法的更多相关文章

  1. Qt中静态变量使用方法

    静态变量可以在各个页面之前使用 先定义一个用于存放静态变量的类 例如datavar 在datavar.h中添加如下代码 #ifndef DATAVAR_H #define DATAVAR_H #inc ...

  2. JAVA中线程同步的方法(7种)汇总

    同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就 ...

  3. Java中线程同步的方法

    同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注 ...

  4. C++ QT中的QSound使用方法

    在pro文件中添加 QT += multimedia 就可以了

  5. 并发编程(六)Object类中线程相关的方法详解

    一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...

  6. QT中定时器的使用方法

    前言:因为QT中用死循环会开销很多内存容易崩溃,这时候使用定时器可以很好解决这个问题. 使用定时器需要用到头文件:include<QTimer> (1)定义定时器 QTimer *upda ...

  7. Qt中重绘制窗口方法:

    void CircleWidget::paintEvent(QPaintEvent * event) { QPainter painter(this); int wight = this->wi ...

  8. 在QT中添加LIB的方法

    注意:-L后面跟着的目录不能用空格,否则会出现读不到的情况. 例如win32下添加D:\app\my.lib   就 pro文件中 LIBS += -LD:\app\debug\ -lmy

  9. QT中显示gif图片方法

    movie = new QMovie(":/timg.gif"); movie->setScaledSize(QSize(,)); ui->giflabel->s ...

随机推荐

  1. static,final,包,访问修饰符,内部类

    static 关键字可以修饰成员变量,被static修饰的成员变量归属于类static关键字可以修饰成员方法:被static修饰的成员方法可以直接使用类名调用,也可以通过对象调用,建议使用类名.非静态 ...

  2. 在使用ajax实现三级联动调用数据库数据并通过调出的数据进行二级表单查询

    在使用ajax实现三级联动查询数据库数据后再使用ajax无刷新方式使用三级联动调出的数据进行二级查询 但是现在遇到问题,在二级查询的时候期望是将数据以表格的形式展示在三级联动的下方,但是现在在查询后会 ...

  3. Ztree改版 - 将图标字体化 - fontAwesome

    引言 ps:小白可以一看,大神勿打~ 用过 ztree 的盆友们都知道,ztree 功能强大,就功能上来说,追求着“无处不按钮”的体验,但好用不好看.可能有朋友说:“我这棵树只有我自己看,够用就行” ...

  4. POJ 1511 Invitation Cards 链式前向星+spfa+反向建边

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 27200   Accepted: 902 ...

  5. Google 视频编码格式 VP9 究竟厉害在哪里

    近期 Google 已经开始研究 VP10 了,VP10 是一个由 WebM 和 Motroska 包含的开放.免费视频编解码器.Google 也已利用 VP10 来处理 YouTube 4K 视频. ...

  6. 《算法》C/C++ 图形处理

    概述 一般图形输出无法就是用循环输出 ,提前构造好图形. 两种方式 ** 模拟法直接输出** ** 二维数组 构造输出** 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEF ...

  7. constructor.prototype

    一个很好玩的小问题考大家对js的理解function alert (){}; ________________ // 填空 alert(1); 使1弹出  http://perfectionkills ...

  8. KMP算法具体解释

    这几天学习kmp算法,解决字符串的匹配问题.開始的时候都是用到BF算法,(BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配 ...

  9. 【cogs 597】【dp】交错匹配

    597. 交错匹配 ★☆ 输入文件:crossa.in 输出文件:crossa.out 简单对照 时间限制:1 s 内存限制:128 MB [问题描写叙述] 有两行自然数. UP[1..N] . DO ...

  10. C#开发微信门户及应用(48) - 在微信框架中整合CacheManager 缓存框架

    在我们的很多框架或者项目应用中,缓存在一定程度上可以提高程序的响应速度,以及减轻服务器的承载压力,因此在一些地方我们都考虑引入缓存模块,这篇随笔介绍使用开源缓存框架CacheManager来实现数据的 ...