1.多线程的理解

在操作系统中线程和进程划分。

操作系统可以同时执行多个任务,每个任务就是进程;进程可以同时执行多个任务,每个任务就是线程。

线程之间相互独立,抢占式执行。对于单核CPU来说同一时刻只能有一个线程执行,一个进程执行。

但是由于CPU不断在这些进程间轮换执行,速度相对人的反应很快,不容易察觉。

既然这样,为什么要使用多线程呢?

a.对于多核cpu,多线程程序充分利用硬件优势

b.对于单核cpu,由于线程上下文的切换会降低整体运行效率。但是为了防止执行耗时操作时界面假死,我们必须把耗时操作单独放在线程中后台执行,防止阻塞主线程无法刷新窗口。

我们来看一下程序的阻塞和非阻塞

这里主要说对于线程之间的公共资源,同时只能由一个线程操作,在此期间其他线程访问将会被挂起直到上一次访问结束,同样客户端执行界面刷新的主线程也会挂起。

非阻塞指的是,一个线程的操作不会阻塞其他线程对事件的接受和处理。

同步和异步

这里说的执行一个操作必须等待执行完成,下面的逻辑才会继续执行,是为同步执行代码

对函数调用后,不会等待执行结果,继续执行下面的代码,是为异步执行。

2.线程使用

QT中多线程得两种处理方法
使用线程在程序执行长时间操作得时候弹出进度条
使用线程可以把占据时间长得程序中任务放到后台去处理
其中一种是继承QThread得run函数,另外一种是把一个继承于QObject得类转移到一个Thread里。
1.继承QThread
QThread继承类只有run函数是在新线程里跑的,其他函数在创建QThread线程中运行
 新建一个线程类ExportThread:QThread ,把耗时操作放在其中run函数中
2.把一个继承于QObject的类转移到一个Thread里
创建一个继承自QObject类得类对象object,使用object.moveToThread(QThread *);
3.线程类中得槽函数在哪个线程中执行得问题
对于方法1中,槽函数在创建线程类对象得线程(一般是主线程)中执行
对于方法2中,槽函数在次线程中执行,通过信号槽调用,直接调用则都在调用线程中执行,
所以要把耗时操作放在槽函数中,外面信号触发,
具体需要参考,connect函数中表示连接方式得参数
如下:
同步调用:信号发出后,当前线程等待槽函数执行完毕才能执行剩余代码。
异步调用:信号发出后,立即执行剩余逻辑,不关心槽函数什么时候执行。
AutoConnection   信号和槽同一线程时,直接联,不同线程时,队列联
DirectConnection  直接联,在主线程中执行,同步调用,不依赖QT事件循环
QueueConnection 队列,次线程中执行,异步调用,槽函数所在对象得线程必须启用QT事件循环
BlockingQueuedConnection 阻塞联,同步调用, 槽函数在次线程中执行,用信号量实现阻塞,     
槽函数所在对象得线程必须启用QT事件循环,此连接只能用于发
 出信号得线程和槽函数执行线程不同得情况。
要么在发射信号得线程中执行
要么在接受者依附得线程中执行
线程安全

 

qt中多线程用法总结的更多相关文章

  1. Qt中多线程问题

    1. 出现的问题 编写视频解码器程序时,把解码那部分单独置于一个线程中进行处理,后来实际应用到项目中发现内存泄漏很严重 问题就出现在多线程中,每次视频解码器程序关闭时首先必须释放其所涉及的堆空间, 由 ...

  2. Qt中 QTableWidget用法总结

    转自--> http://edsionte.com/techblog/archives/3014 http://hi.baidu.com/fightiger/item/693aaa0f0f87d ...

  3. Qt中两种定时器用法

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObj ...

  4. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  5. Qt中的多线程编程

    http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...

  6. 多线程中lock用法的经典实例

    多线程中lock用法的经典实例 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...

  7. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  8. Qt中采用多线程实现Socket编程

    Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程Socket编程,由于工作的需要,开始 ...

  9. Qt中的多线程与线程池浅析+实例

    1. Qt中的多线程与线程池 今天学习了Qt中的多线程和线程池,特写这篇博客来记录一下 2. 多线程 2.1 线程类 QThread Qt 中提供了一个线程类,通过这个类就可以创建子线程了,Qt 中一 ...

随机推荐

  1. tf.FIFOQueue()

    Tensorflow–tf.FIFOQueue详解描述tf.FIFOQueue根据先进先出(FIFO)的原则创建一个队列.队列是Tensorflow的一种数据结构,每个队列的元素都是包含一个或多个张量 ...

  2. Labyrinth(记忆化BFS)

    Labyrinth http://codeforces.com/problemset/problem/1064/D time limit per test 2 seconds memory limit ...

  3. js如何切割字符串

    <script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new A ...

  4. Asp.Net 用户验证(自定义IPrincipal和IIdentity)

    http://www.cnblogs.com/JimmyZhang/archive/2008/12/07/1349457.html

  5. 2018.09.21 atcoder An Invisible Hand(贪心)

    传送门 简单贪心啊. 这题显然跟t并没有关系,取差量最大的几组买入卖出就行了. 于是我们统计一下有几组差量是最大的就行了. 代码: #include<bits/stdc++.h> #def ...

  6. hdu-1133

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1133 思路:有m个人拿50元的纸币,n个人拿100元的纸币门票价格是50元,要求每个售票员遇到100元 ...

  7. Linux命令:sed

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  8. MyEclipse 过期

    package util; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamRea ...

  9. DataFrame按行读取:DataFrame之values

    http://blog.csdn.net/u014607457/article/details/51290582 def fill_core(self): RatingTable=pd.read_cs ...

  10. WPF MediaKit的一点问题

    原版WPF MediaKit在捕获摄像头视频时,如果不使用640*480分分辨率输出,会出现NewVideoSample事件不被触发的问题. 经数日摸索,终于明白SetVideoCapturePara ...