快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

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 将唤醒等待该事件的所有线程或者唤醒任意一个被选 中的线程。

3、用户自定义事件在多线程编程中的应用

在 Qt 系统中,定义了很多种类的事件,如定时器事件、鼠标移动事件、键盘事件、窗口控件事件等 。通常,事件都来自底层的窗口系统,Qt 的主事件循环函数从系统的事件队列中获取这些事件,并将它 们转

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号