qt中线程的使用方法
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中线程的使用方法的更多相关文章
- Qt中静态变量使用方法
静态变量可以在各个页面之前使用 先定义一个用于存放静态变量的类 例如datavar 在datavar.h中添加如下代码 #ifndef DATAVAR_H #define DATAVAR_H #inc ...
- JAVA中线程同步的方法(7种)汇总
同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就 ...
- Java中线程同步的方法
同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注 ...
- C++ QT中的QSound使用方法
在pro文件中添加 QT += multimedia 就可以了
- 并发编程(六)Object类中线程相关的方法详解
一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...
- QT中定时器的使用方法
前言:因为QT中用死循环会开销很多内存容易崩溃,这时候使用定时器可以很好解决这个问题. 使用定时器需要用到头文件:include<QTimer> (1)定义定时器 QTimer *upda ...
- Qt中重绘制窗口方法:
void CircleWidget::paintEvent(QPaintEvent * event) { QPainter painter(this); int wight = this->wi ...
- 在QT中添加LIB的方法
注意:-L后面跟着的目录不能用空格,否则会出现读不到的情况. 例如win32下添加D:\app\my.lib 就 pro文件中 LIBS += -LD:\app\debug\ -lmy
- QT中显示gif图片方法
movie = new QMovie(":/timg.gif"); movie->setScaledSize(QSize(,)); ui->giflabel->s ...
随机推荐
- mysql安装后服务启动不了(总结)
mysql安装后服务启动不了 1.1 前言 最近真的是倒霉到家,装个mysql都能把所有的问题给问候了一遍······不过这也是一个宝贵的经验,得好好总结下,毕竟也不知道以后会不会再次遇到.如果有网友 ...
- PostgreSQL索引描述
索引方式:唯一索引,主键索引,多属性索引,部分索引,表达式索引. 索引类型:B-Tree,Hash,GiST,GIN以及表达式索引 PostgreSQL所有索引都是“从属索引”,也就是说,索引在物理上 ...
- post 与get 区别
刷新/后退按钮 GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交). 书签 GET书签可收藏,POST为书签不可收藏. 缓存 GET能被缓存 缓存是针对URL来进 ...
- css3的动画特效--元素旋转
开发中,视觉要你实现一个元素的旋转问题,比如说如下图所示: 思路:首先动画动效肯定离不开anmimation动画. 和transition动画一样,animation动画也是CSS3动画的一种,这类动 ...
- 网络基础之 OSI七层模型
OSI七层模型模型图如下: 前三层(应用层,表示层,会话层)=>给用户提供服务. 后四层(传输层,网络层,数据链路层,物理层)=>数据传递提供服务. 其中 数据链路层中MAC地址负责局域网 ...
- 【004】【JVM——垃圾收集算法】
Java虚拟机学习总结文件夹 垃圾收集算法 垃圾收集算法的实现涉及大量的程序细节,并且各个平台的虚拟机操作内存的方法又各不同样,介绍几种垃圾收集算法的思想及其发展过程. 标记-清除算法 垃圾收集 ...
- 黑马day16 jquery&属性过滤选择器
属性过滤选择器的过滤规则是通过元素的属性来获取对应的元素 .[attribute] 使用方法: $("div[id]") ; 返回值 集合元素 说明:匹配包括给定属性的元素.样 ...
- quick-cocos2d-x教程1:在window上创建第一个项目文件夹,并制作helloworld
说明:此教程是针对cocos2dx 2.0系列的,3.0的版本号,如今还没有公布出来. 1)首先从github.com把这个项目下载到本地.然后装到d盘的根文件夹,并设置文件夹路径为d:\quick- ...
- poj 1087 A Plug for UNIX 【最大流】
题目连接:http://poj.org/problem? id=1087 题意: n种插座 ,m个电器,f组(x,y)表示插座x能够替换插座y,问你最多能给几个电器充电. 解法:起点向插座建边,容量1 ...
- 入门vue----(vue的安装)
1.安装node.js 2.基于node.js,利用淘宝npm镜像安装相关依赖 在cmd里直接输入:npm install -g cnpm –registry=https://registry.npm ...