Linux系统下QT中的多线程编程

Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能。为了满足 用户构造复杂图形界面系统的需求,Qt 提供了丰富的多线程编程支持。

Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能。为了满足 用户构造复杂图形界面系统的需求,Qt 提供了丰富的多线程编程支持。从 2.2 版本开始,Qt 主要从下 面三个方面对多线程编程提供支持:一、构造了一些基本的与平台无关的线程类;二、提交用户自定义事 件的 Thread-safe 方式;三、多种线程间同步机制,如信号量,全局锁。这些都给用户提供了极大的方 便。不过,在某些情况下,使用定时器机制能够比利用 Qt 本身的多线程机制更方便地实现所需要的功能 ,同时也避免了不安全的现象发生。本文不仅对 Qt 中的多线程支持机制进行了讨论,还着重探讨了利用 定时器机制模拟多线程编程的方法。

1、系统对多线程编程的支持

不同的平台对 Qt 的多线程支持方式是不同的。当用户在 Windows 操作系统上安装 Qt 系统时,线程 支持是编译器的一个选项,在 Qt 的 mkfiles 子目录中包括了不同种类编译器的编译文件,其中带有 - mt 后缀的文件才是支持多线程的。

而在 Unix 操作系统中,线程的支持是通过在运行 configure 脚本文件时添加 -thread 选项加入的 。安装过程将创建一个独立的库,即 libqt-mt,因此要支持多线程编程时,必须与该库链接(链接选项 为-lqt-mt),而不是与通常的 Qt 库(-lqt)链接。

另外,无论是何种平台,在增加线程支持时都需要定义宏 QT_THREAD_SUPPORT(即增加编译选项- DQT_THREAD_SUPPORT)。在 Windows 操作系统中,这一点通常是在 qconfig.h 文件中增加一个选项来实 现的。而在 Unix 系统中通常添加在有关的 Makefile 文件中。

2、Qt中的线程类

在 Qt 系统中与线程相关的最重要的类当然是 QThread 类,该类提供了创建一个新线程以及控制线程 运行的各种方法。线程是通过 QThread::run() 重载函数开始执行的,这一点很象 Java 语言中的线程类 。在 Qt 系统中,始终运行着一个GUI 主事件线程,这个主线程从窗口系统中获取事件,并将它们分发到 各个组件去处理。在 QThread 类中还有一种从非主事件线程中将事件提交给一个对象的方法,也就是 QThread::postEvent()方法,该方法提供了 Qt 中的一种 Thread-safe 的事件提交过程。提交的事件被 放进一个队列中,然后 GUI 主事件线程被唤醒并将此事件发给相应的对象,这个过程与一般的窗口系统 事件处理过程是一样的。值得注意的是,当事件处理过程被调用时,是在主事件线程中被调用的,而不是 在调用QThread::postEvent 方法的线程中被调用。比如用户可以从一个线程中迫使另一个线程重画指定 区域:

  QWidget *mywidget;  QThread::postEvent(mywidget, new QPaintEvent(QRect

(0,0,100,100)));

然而,只有一个线程类是不够的,为编写出支持多线程的程序,还需要实现两个不同的线程对共有数 据的互斥访问,因此 Qt 还提供了 QMutex 类,一个线程在访问临界数据时,需要加锁,此时其他线程是 无法对该临界数据同时加锁的,直到前一个线程释放该临界数据。通过这种方式才能实现对临界数据的原 子操作。

除此之外,还需要一些机制使得处于等待状态的线程在特定情况下被唤醒。QWaitCondition 类就提供 了这种功能。当发生特定事件时,QWaitCondition 将唤醒等待该事件的所有线程或者唤醒任意一个被选 中的线程。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索qt
, qt c++
, qt mysql
, qt qtreewidget
, qt网络
, 线程
, 多线程
, 系统
, 事件
, vs qt 2001
, 多线程编程
, qt 窗体间通信
, 支持
一个
qt多线程编程实例、qt多线程编程、qt5 多线程编程实例、qt linux 系统监控、qt设置系统时间 linux,以便于您获取更多的相关知识。

时间: 2024-10-02 18:32:51

Linux系统下QT中的多线程编程的相关文章

Linux系统下Qt的基本安装和配置

  Qt Creator支持中文,启动速度比Eclipse.Netbeans更快,界面也更美观,跟输入法Fcitx协作良好(光标跟随). 你既可以把Qt Creator当代码编辑器作为vim辅助,好处在于Qt Creator能够自动parse项目,形成友好快速的智能提示,而且你也同样可以使用Qt Creator里面的gdb前端(上图)和valgrind前端(高清大图) 对项目进行调试和内存分析,不过Makefile就要自己写或者用autotools生成了,这对于使用vim进行编程的同学来说,应该

Linux系统下使用Flacon导入CD音频文件中的歌曲

Linux系统下使用Flacon导入CD音频文件中的歌曲  Flacon 是一款 Qt 工具,用于从音频 CD 中提取个人曲目,基于在CUE文件中提供的信息提取如 WavPack. APE. FLAC. WAV 或 True Audio. 该应用程序提供了输出格式具体设置:你可以设置除 ReplayGain 以外的输出质量,压缩等,无论是每个专辑或音轨. Flacon 另外一个有用的功能就是标记导出的音轨文件,基于在CUE文件或手动提供的信息. 最新版本 Flacon 1.2.0 最近已经发布,

人脸识别-linux下qt中opencv打开摄像头HIGHGUI ERROR:OpenCV Error:

问题描述 linux下qt中opencv打开摄像头HIGHGUI ERROR:OpenCV Error: 我在Ubuntu下用qt结合opencv做一个人眼状态识别的程序,qt做界面,程序在vs控制台环境下已经可以运行,但是qt下出错.错误信息 如下: HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /home/mkc/op

在 Linux 系统下从 ISO 镜像中提取和复制文件的 3 种方法

假设你的 Linux 服务器上有一个超大的 ISO 镜像文件,你想要打开它,然后提取或者复制其中的一个文件.你会怎么做呢? 其实在 Linux 系统里,有很多方法来实现这个要求. 比如说,你可以使用传统的 mount 命令以只读方式把 ISO 镜像文件加载为 loop 设备,然后再把文件复制到另一个目录. 在 Linux 系统下提取 ISO 镜像文件 为了完成该测试,你得有一个 ISO 镜像文件(我使用 ubuntu-16.10-server-amd64.iso 系统镜像文件)以及用于挂载和提取

Android开发中的多线程编程技术

Android开发中的多线程编程技术 [IT168技术]多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗?多线程程序的"麻烦"源于它很抽象.与单线程程序运行模式不同,但只要掌握了它们的区别,编写多线程程序就会很容易了.下面让我们集中精力开始学习吧! 多线程案例--计时器 我在给我的学生讲多线程的时候都会举一个计时器的案例,因为计时器案例是多线程的经典应用. 这个案例中,屏幕启动之后,进入如图8-1所示的界面.

《操作系统真象还原》——0.14 为什么Linux系统下的应用程序不能在Windows系统下运行

0.14 为什么Linux系统下的应用程序不能在Windows系统下运行 其实,Windows下的程序也无法直接在Linux下运行. 对于这个问题,很多同学都会马上给出答案:格式不同.其实--答对啦,确实是格式不同,不过这只是一方面,还有另一方面,系统API不同,API即Application Programming Interface,应用程序编程接口. 先说说格式.其实格式也算是协议,就是在某个固定的位置有固定意义的数据.Linux下的可执行程序格式是elf,也就是 "Executable

在Linux系统下建立基于MPICH2的高性能分布式并行计算环境

MPICH2 提供了在现有的软硬件架构下对大数据进行并行.分布式处理的一个平台.本文将介绍如何在 Linux 系统下建立基于 MPICH2 的高性能分布式并行计算环境. MPI(Message Passing Interface)是由 MPI 委员会制定的一个消息传递标准,其中定义了一系列用于分布式环境中进行进程间通信的编程接口,目前有 MPI-1 和 MPI-2 两个版本.MPICH2 就是对 MPI 的一个具体实现,MPICH2 在保证高性能的同时保持了高度的可移植性,支持包括 AIX.Li

Linux系统下优秀的代理服务器软件:Squid

作为一种免费的网络操作系统,Linux越来越受到广大网络爱好者的欢迎,目前Internet上运行的主机有相当一部分采用的就是Linux,而且中国已经把Linux作为政府上网的指定网络操作系统.种种迹象表明,Linux正在逐渐走向成熟. 为了解决Internet发展迅速和IP地址资源紧张的矛盾,代理服务器的使用越来越广泛.Squid是一种在Linux系统下使用的比较优秀的代理服务器软件. 代理服务 代理服务是指由一台拥有标准IP地址的机器代替若干没有标准IP地址的机器和 Internet上的其它主

linux系统下grep egrep fgrep用法以及正则表达式

一.grep.egrep.fgrep命令 本文中主要介绍了linux系统下grep egrep fgrep命令和正则表达式的基本参数和使用格式.方法.(注释:文中fg代表例子,) 1.1.基本定义: grep(global search regular RE ) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它只能使用基本的正则表达式来搜索文本,并把匹配的行打印出来. grep是很常见也很常用的命令,它的主要功能是进行字符串数据的比较,