Qt5多线程编程的实现

目录
  • 一、线程基础
    • 1、GUI线程与工作线程
    • 2、数据的同步访问
  • 二、QT多线程简介
  • 三、QThread线程
  • 四、简单实例

一、线程基础

1、GUI线程与工作线程

每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。

2、数据的同步访问

每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。

二、QT多线程简介

    Qt通过三种形式提供了对线程的支持,分别是平台无关的线程类、线程安全的事件投递、跨线程的信号-槽连接。

    Qt中线程类包含如下:

  • QThread 提供了跨平台的多线程解决方案
  • QThreadStorage 提供逐线程数据存储
  • QMutex 提供相互排斥的锁,或互斥量
  • QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁
  • QReadWriterLock 提供了一个可以同时读操作的锁
  • QReadLocker与QWriteLocker 自动对QReadWriteLock 加锁与解锁
  • QSemaphore 提供了一个整型信号量,是互斥量的泛化
  • QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

三、QThread线程

1、QThread线程基础

    QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。

    void run()函数是线程体函数,用于定义线程的功能。

    void start()函数是启动函数,用于将线程入口地址设置为run函数。

    void terminate()函数用于强制结束线程,不保证数据完整性和资源释放。

    QCoreApplication::exec()总是在主线程(执行main()的线程)中被调用,不能从一个QThread中调用。在GUI程序中,主线程也称为GUI线程,是唯一允许执行GUI相关操作的线程。另外,必须在创建一个QThread前创建QApplication(or QCoreApplication)对象。

    当线程启动和结束时,QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。

    从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()槽。 
    使用wait()来阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。

    静态函数currentThreadId()和currentThread()返回标识当前正在执行的线程。前者返回线程的ID,后者返回一个线程指针。

要设置线程的名称,可以在启动线程之前调用setObjectName()。如果不调用setObjectName(),线程的名称将是线程对象的运行时类型(QThread子类的类名)。

四、简单实例

1、建立工程

2、设计ui及控件、控件属性

3、添加工作线程

建立头文件workthread.h

在右侧添加如下代码

#include <QThread>

class WorkThread : public QThread
{
    Q_OBJECT

public:
    WorkThread();

protected:
    void run();
};

4、添加workthread.cpp文件

在右侧添加如下代码:

重写run()函数

重写run()函数

#include "workthread.h"
#include <QtDebug>

WorkThread::WorkThread()
{

}

void WorkThread::run()
{
    while (true)
    {
        for ( int n = 0; n < 10; n++ )
        {
            qDebug()<<n<<n<<n<<n<<n<<n<<n<<n;
        }
    }
}

5、在threaddlg.h中添加如下内容:

#include "workthread.h"
#define MAXSIZE 1

public slots:
    void slotStart();
    void slotStop();
    void slotExit();

private:

    WorkThread *workThread[MAXSIZE];

 6、在threaddlg.cpp中完成槽函数功能

    connect(ui->startBtn,   SIGNAL(clicked(bool)),this, SLOT(slotStart()));
    connect(ui->stopBtn,    SIGNAL(clicked(bool)),this, SLOT(slotStop()));
    connect(ui->exitBtn,    SIGNAL(clicked(bool)),this, SLOT(slotExit()));
 
void threadDlg::slotStart()
{
    for ( int i = 0; i < MAXSIZE; i++ )
    {
        workThread[i] = new WorkThread();
    }

    for ( int i = 0; i < MAXSIZE; i++ )
    {
        workThread[i]->start();
    }

    ui->startBtn->setEnabled(false);
    ui->stopBtn->setEnabled(true);
}
void threadDlg::slotStop()
{
    for ( int i = 0; i < MAXSIZE; i++ )
    {
        workThread[i]->terminate();
        workThread[i]->wait();
    }

    ui->startBtn->setEnabled(true);
    ui->stopBtn->setEnabled(false);
}
void threadDlg::slotExit()
{
    this->close();
}

运行效果

到此这篇关于Qt5多线程编程的实现的文章就介绍到这了,更多相关Qt5多线程 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Pyqt5 实现多线程文件搜索的案例

    我学Java的时候也用Swing做了一个文件搜索的小程序,但界面真的挺丑的,现在学了点python,感觉python是最简单的语言,没有之一. (大家没事都可以来学的,真的很简单有趣哦) 我采用的是pyqt5,所以需要先安装Pyqt5模块 直接cmd命令输入 pip install pyqt5 闲言少叙,上代码!! # -*- coding: utf-8 -*- # @Time : 2018\9\15 20:39 # @Author : Tang weiyang # @File : FileSe

  • PyQt5 pyqt多线程操作入门

    首先来看一个例子: # coding=utf-8 __author__ = 'a359680405' from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * global sec sec=0 def setTime(): global sec sec+=1 lcdNumber.display(sec) #LED显示数字+1 def work(): timer.start(1000) #计

  • Qt5.9实现简单的多线程实例(类QThread)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程.第二种方法是继承一个QObject类,然后利用moveToThread()函数开启一个线程槽函数,将要花费大量时间计算的代码放入该线程槽函数中.第二种方法可以参考我写的另一篇博客:https://www.jb51.net/article/223796.htm 下面我总结的主要是第一种方法.(注意:

  • Qt5.9继承QObject创建多线程实例

    本博客主要总结Qt中创建多线程的另一种方法,不是通过继承类QThread,而是通过继承对象QObject,来实现多线程.(可以直接跳过下面内容,看1.1内容) 利用继承QObject方法创建多线程,主要的步骤有一下几点:(注意:退出线程循环后,还要调用QThread::quit()函数,该线程才会触发QThread::finished()信号) a1:首先创建一个类MyThread,基类为QObject. a2:在类MyThread中创建一个槽函数,用于运行多线程里面的代码.所有耗时代码,全部在

  • PyQt5多线程刷新界面防假死示例

    在做GUI界面时我们希望后台任务能够与UI分开,在PyQt中,主线程用来重绘界面.而子线程里边的实时处理结果需要反馈到界面,子线程里边不能执行界面更新操作. wxpython多线程刷新界面转到 https://www.jb51.net/article/176308.htm 下面给出类Python3+PyQt5多线程防假死动态刷新界面的模板 from PyQt5 import QtWidgets, QtCore import sys from PyQt5.QtCore import * impor

  • Qt5多线程编程的实现

    目录 一.线程基础 1.GUI线程与工作线程 2.数据的同步访问 二.QT多线程简介 三.QThread线程 四.简单实例 一.线程基础 1.GUI线程与工作线程 每个程序启动后拥有的第一个线程称为主线程,即GUI线程.QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作. 2.数据的同步访问 每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量.线程共享相同的地址空间. 二.QT多线程简介     Qt通过三种形式

  • 深入理解QT多线程编程

    一.线程基础 1.GUI线程与工作线程 每个程序启动后拥有的第一个线程称为主线程,即GUI线程.QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作. 2.数据的同步访问 每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量.线程共享相同的地址空间. 二.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供

  • linux下c语言的多线程编程

    我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执行的最小单元. 一般一个最简单的程序最少会有一个线程,就是程序本身,也就是主函数(单线程的进程可以简单的认为只有一个线程的进程) 一个线程阻塞并不会影响到另外一个线程. 多线程的进程可以尽可能的利用系统CPU资源. 1创建线程 先上一段在一个进程中创建一个线程的简单的代码,然后慢慢深入. #incl

  • linux下的C\C++多进程多线程编程实例详解

    linux下的C\C++多进程多线程编程实例详解 1.多进程编程 #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { pid_t child_pid; /* 创建一个子进程 */ child_pid = fork(); if(child_pid == 0) { printf("child pid\n"); exit(0); } else { print

  • Java多线程编程小实例模拟停车场系统

    下面分享的是一个Java多线程模拟停车场系统的小实例(Java的应用还是很广泛的,哈哈),具体代码如下: Park类 public class Park { boolean []park=new boolean[3]; public boolean equals() { return true; } } Car: public class Car { private String number; private int position=0; public Car(String number)

  • Java多线程编程安全退出线程方法介绍

    线程停止 Thread提供了一个stop()方法,但是stop()方法是一个被废弃的方法.为什么stop()方法被废弃而不被使用呢?原因是stop()方法太过于暴力,会强行把执行一半的线程终止.这样会就不会保证线程的资源正确释放,通常是没有给与线程完成资源释放工作的机会,因此会导致程序工作在不确定的状态下 那我们该使用什么来停止线程呢 Thread.interrupt(),我们可以用他来停止线程,他是安全的,可是使用他的时候并不会真的停止了线程,只是会给线程打上了一个记号,至于这个记号有什么用呢

  • Java多线程编程实现socket通信示例代码

    流传于网络上有关Java多线程通信的编程实例有很多,这一篇还算比较不错,代码可用.下面看看具体内容. TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以

  • java多线程编程学习(线程间通信)

    一.概要 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的必用方案之一.可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高cpu利用率的同时还会使程序员对各线程任务在处理过程中进行有效的把控和监督. 二.等待/通知机制 1."wait/notify"机制:等待/通知机制,wait使线程暂停运行,而notify 使暂停的线程继续运行.用一个厨师和服务员的交互来说明: (1) 服务员取到菜的时间取决于厨师,所以服务员就有&

  • IOS多线程编程NSThread的使用方法

    IOS多线程编程NSThread的使用方法 NSThread是多线程的一种,有两种方法创建子线程 (1)优点:NSThread 比GCD.NSOperation都轻量级 (2)缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 第一种是隐藏创建,有以下几种方式: (1)多用于串行:- (id)performSelector:(SEL)aSelector withObject:(id)object; (2)后台执行,多用于并行:- (void)performSele

  • IOS多线程编程的3种实现方法

    前言 在多线程简介中,我已经说明过了,为了提高界面的流畅度以及用户体验.我们务必要把耗时的操作放到别的线程中去执行,千万不要阻塞主线程. iOS中有以下3种多线程编程方法: NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue 1.NSThread 这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法.但是因为需要自己管理线程的生命周期,线程同步.经常使用NSThread进行调试,在实际项目中不推荐使用. //

随机推荐