qt中线程的使用方法

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

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

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

a、第一步

b、第二步

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

void run();

(3)初始化线程

HDThread mythread = new HDThread();

(4)启动线程

mythread->start();

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

线程头文件hdthread.h:

 1 #ifndef HDTHREAD_H
 2 #define HDTHREAD_H
 3 #include <QThread>
 4 #include <QLabel>
 5 #include <QMutex>
 6
 7 class HDTHread : public QThread
 8 {
 9 public:
10     HDTHread(QMutex* mtex,QObject *parent = 0);
11     void run();//自定义的run函数
12     void setLabel(QLabel *lb);
13 private:
14     QLabel *label;
15     QMutex *mutex; //互斥锁
16 };
17
18 #endif // HDTHREAD_H

主函数的头文件threadqt.h

 1 #ifndef THREADQT_H
 2 #define THREADQT_H
 3
 4 #include <QMainWindow>
 5 #include <hdthread.h>
 6 #include <writefile.h>
 7 #include <QMutex>
 8 #include <QSemaphore>
 9
10 namespace Ui {
11 class ThreadQt;
12 }
13
14 class ThreadQt : public QMainWindow
15 {
16     Q_OBJECT
17
18 public:
19     explicit ThreadQt(QWidget *parent = 0);
20     ~ThreadQt();
21
22      //定义静态的信号类
23     static QSemaphore *sp_A;
24     static QSemaphore *sp_B;
25 private slots:
26     void on_pushButton_clicked();
27
28 private:
29     Ui::ThreadQt *ui;
30
31     HDTHread *thread; //hdtread类,里面继承了线程
32     WriteFile *writethread;
33     QMutex mutex;//定义互斥锁类
34
35 };
36
37 #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()%1000; //取随机数
        //this->mutex->lock();//上锁
        ThreadQt::sp_A->acquire();//请求信号
        this->label->setText(QString::number(data));
         sleep(1);
        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(1);
    sp_B = new QSemaphore(0);

}

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();//解锁
时间: 2024-10-17 21:13:00

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

Qt中静态变量使用方法

静态变量可以在各个页面之前使用 先定义一个用于存放静态变量的类 例如datavar 在datavar.h中添加如下代码 #ifndef DATAVAR_H #define DATAVAR_H #include <QObject> class dataVar : public QObject { Q_OBJECT public: explicit dataVar(QObject *parent = 0); static QString loginName ;//登录名 signals: publ

JAVA中线程同步的方法

用什么关键字修饰同步方法 ? 用synchronized关键字修饰同步方法  同步有几种实现方法,都是什么?分别是synchronized,wait与notify wait():使一个线程处于等待状态,并且释放所持有的对象的lock.sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常.notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线

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

一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类. 二.同步代码块 即有synchronized关键字修饰的语句块. 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如: synchronized(object){ } 注:同步是一种高开销

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

一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详解 */ public class MyNotify { // 在多线程间共享的对象上使用wait private String[] shareObj = {"true"}; public static void main(String[] args) { MyNotify test =

Qt中自定义类的方法

参考百度文库的一种方法,讲解还不错,贴在这里,大家可以参考一下 http://wenku.baidu.com/link?url=8LD6wyXHcVwq-ojHaOAwg8zg4MVaJYy4jDrq72s6bvExRl2jxsnOUiF2ydT_7A3m941N1zyab1CA1yMsjihZdZVuK--KHuapEb-SSmVG_Wi###

Qt中重绘制窗口方法:

1 void CircleWidget::paintEvent(QPaintEvent * event) 2 { 3 QPainter painter(this); 4 5 int wight = this->width(); 6 int heigth = this->height(); 7 8 if (m_timers==0) 9 { 10 11 QColor green(0, 0, 0xff); 12 QPen pen(green); 13 14 painter.setBrush(QBru

在QT中添加LIB的方法

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

QT中定时器的使用方法

前言:因为QT中用死循环会开销很多内存容易崩溃,这时候使用定时器可以很好解决这个问题. 使用定时器需要用到头文件:include<QTimer> (1)定义定时器 QTimer *update_time; (2)监听定时器,超时的时候启动槽函数 connect(update_time,SIGNAL(timeout()),this,SLOT(time_update())); (3)启动定时器 update_time->start(1000); //1秒钟后启动

Qt中快速读写Excel方法封装

#include "RwExcel.h"/*快速读写的机制是实现获取有效区域只调用一次dynamicCall("Value");或setProperty("Value", var);即可, *而不是在循环里多次被用 */ RwExcel::RwExcel(){} RwExcel::~RwExcel(){}void RwExcel::castVariant2ListListVariant(const QVariant &var, QList