快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
换为 QEvent,然后传给相应的 QObjects 对象。

除此之外,为了满足用户的需求,Qt 系统还提供了一个 QCustomEvent 类,用于用户自定义事件,这 些自定义事件可以利用 QThread::postEvent() 或者QApplication::postEvent() 被发给各种控件或其他 QObject 实例,而 QWidget 类的子类可以通过 QWidget::customEvent() 事件处理函数方便地接收到这 些自定义的事件。需要注意的是:QCustomEvent 对象在创建时都带有一个类型标识 id 以定义事件类型 ,为了避免与 Qt 系统定义的事件类型冲突,该 id 值应该大于枚举类型 QEvent::Type 中给出的 "User" 值。

在下面的例子中,显示了多线程编程中如何利用用户自定义事件类。UserEvent类是用户自定义的事件 类,其事件标识为346798,显然不会与系统定义的事件类型冲突。

  class UserEvent : public QCustomEvent  //用户自定义的事件类
  {
   public:
   UserEvent(QString s) : QCustomEvent(346798), sz(s) { ; }
   QString str() const { return sz; }
  private:
   QString sz;
  };

UserThread类是由QThread类继承而来的子类,在该类中除了定义有关的变量和线程控制函数外,最主 要的是定义线程的启动函数UserThread::run(),在该函数中创建了一个用户自定义事件UserEvent,并利 用QThread类的postEvent函数提交该事件给相应的接收对象。

  class UserThread : public QThread   //用户定义的线程类
  {
   public:
   UserThread(QObject *r, QMutex *m, QWaitCondition *c);
  QObject *receiver;
  }

  void UserThread::run()   //线程类启动函数,在该函数中创建了 一个用户自定义事件
  {UserEvent *re = new UserEvent(resultstring);
     QThread::postEvent(receiver, re);
  }

UserWidget类是用户定义的用于接收自定义事件的QWidget类的子类,该类利用slotGo()函数创建了一 个新的线程recv(UserThread类),当收到相应的自定义事件(即id为346798)时,利用customEvent函 数对事件进行处理。

  void UserWidget::slotGo()  //用户定义控件的成员函数
  { mutex.lock();
    if (! recv)
   recv = new UserThread(this, &mutex, &condition);
   recv->start();
   mutex.unlock();
  }

  void UserWidget::customEvent (QCustomEvent *e)  //用户自定义事件处理函数
  { if (e->type()==346798)
   {
   UserEvent *re = (UserEvent *) e;
      newstring = re->str();
     }
  }

在这个例子中,UserWidget对象中创建了新的线程UserThread,用户可以利用这个线程实现一些周期 性的处理(如接收底层发来的消息等),一旦满足特定条件就提交一个用户自定义的事件,当UserWidget 对象收到该事件时,可以按需求做出相应的处理,而一般情况下,UserWidget对象可以正常地执行某些例 行处理,而完全不受底层消息的影响。

4、利用定时器机制实现多线程编程

为了避免Qt系统中多线程编程带来的问题,还可以使用系统中提供的定时器机制来实现类似的功能。 定时器机制将并发的事件串行化,简化了对并发事件的处理,从而避免了thread-safe方面问题的出现。

在下面的例子中,同时有若干个对象需要接收底层发来的消息(可以通过Socket、FIFO等进程间通信 机制),而消息是随机收到的,需要有一个GUI主线程专门负责接收消息。当收到消息时主线程初始化相 应对象使之开始处理,同时返回,这样主线程就可以始终更新界面显示并接收外界发来的消息,达到同时 对多个对象的控制;另一方面,各个对象在处理完消息后需要通知GUI主线程。对于这个问题,可以利用 第3节中的用户自定义

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号