Linux系统下QT中的多线程编程
换为 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 //用户自定义的事件类 UserThread类是由QThread类继承而来的子类,在该类中除了定义有关的变量和线程控制函数外,最主 要的是定义线程的启动函数UserThread::run(),在该函数中创建了一个用户自定义事件UserEvent,并利 用QThread类的postEvent函数提交该事件给相应的接收对象。 class UserThread : public QThread //用户定义的线程类 UserWidget类是用户定义的用于接收自定义事件的QWidget类的子类,该类利用slotGo()函数创建了一 个新的线程recv(UserThread类),当收到相应的自定义事件(即id为346798)时,利用customEvent函 数对事件进行处理。 void UserWidget::slotGo() //用户定义控件的成员函数 在这个例子中,UserWidget对象中创建了新的线程UserThread,用户可以利用这个线程实现一些周期 性的处理(如接收底层发来的消息等),一旦满足特定条件就提交一个用户自定义的事件,当UserWidget 对象收到该事件时,可以按需求做出相应的处理,而一般情况下,UserWidget对象可以正常地执行某些例 行处理,而完全不受底层消息的影响。 4、利用定时器机制实现多线程编程 为了避免Qt系统中多线程编程带来的问题,还可以使用系统中提供的定时器机制来实现类似的功能。 定时器机制将并发的事件串行化,简化了对并发事件的处理,从而避免了thread-safe方面问题的出现。 在下面的例子中,同时有若干个对象需要接收底层发来的消息(可以通过Socket、FIFO等进程间通信 机制),而消息是随机收到的,需要有一个GUI主线程专门负责接收消息。当收到消息时主线程初始化相 应对象使之开始处理,同时返回,这样主线程就可以始终更新界面显示并接收外界发来的消息,达到同时 对多个对象的控制;另一方面,各个对象在处理完消息后需要通知GUI主线程。对于这个问题,可以利用 第3节中的用户自定义 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |