S60和Qt的异步操作
文章信息
- TSQ001335
- 平台:S60
- 关键字:CActive, Active Object, Signals and Slots
概述
本文给出S60和Qt异步请求处理之比较。
描述
下面的表格比较了S60中的活动对象/活动规划器(Active Objects/Active Scheduler)机制和Qt中的信号/槽(signals/slots)机制。
方案
| 操作 | S60 | Qt |
|---|---|---|
| 使用异步服务提供者来为应用程序进行异步事件处理 | 活动对象(Active Object) | 信号/槽(Signal/Slot) |
| 类层次结构 | 需要使用异步服务的用户定义类应该从CAcitve派生。 | 用户定义类应该从QObject或它的任何子类派生。 |
| 异步请求发出时的等待循环 | 若异步事件在等待完成时,CActiveScheduler类模拟等待循环。一旦事件完成,就调用相关的处理器,比如,RunL。 | 无需独立的等待循环。信号/槽(Signal/slot)机制与应用程序主循环一起负责处理。 |
| UI中的异步事件处理 | 内建与UI应用中的活动规划器(Active scheduler)使得应用程序在无线循环中等待,直到接收到下一个事件。事件在用户与UI部件交互时产生。 | QApplication为应用程序管理事件循环。信号内建于标准UI部件,在用户与UI部件交互时发出(生成)信号。 |
| 异步事件完成时所调用的函数 | 对于用户定义类,调用标准函数RunL。 | 对于用户定义类,你可以定义信号,发出信号以及决定哪个函数应该处理这些信号。 |
| 事件/信号从标准UI部件需要被处理时所调用的函数 | 调用标准函数,诸如:OfferKeyEventL, HandlePointerEventL及HandleCommandL。 | 有标准的信号(signal)函数定义,但你可以决定信号(signal)发出时需要调用的槽(slot)。 |
| 标准函数之输入参数 | 标准函数(RunL, OfferKeyEventL)的参数是预先定义好的且不能改变。 | 信号参数和槽参数由开发人员决定。这样的好处是可以减少类级变量(成员变量),因为它们可以在函数中创建并在信号和槽连接时作为参数传入信号/槽。即使是有预先定义好参数的标准信号也可以使用QSignalMapper类来进行改变。 |
| 用户定义类中的异步请求数量 | 在用户定义类中只能有一个未完成的请求,通过RunL来服务。 | 在每个类中可以连接有多个信号和槽。因此可以服务/处理多个请求。 |
| 用户定义事件 | 不行 | 用户定义类可以子类化标准类,可以定义它们自己的信号。用户定义类也可以添加它们自己的信号。 |
| 对象间通讯机制 | 没有单独的机制。需要信息的对象通常作为成员变量,使用标准C++的getter/setter函数。没有直接的机制自动获知对象的状态信息。 | 信号和槽可用来在对象间交换信息,消除了对象作为成员变量的需要。通过让对象发出信号和在类中链接信号到某个槽就可以跟踪对象状态。 |
| 让异步调用象同步调用一样 | 根据所执行的异步函数在同一线程还是不同线程,可使用API函数:CActiveSchedulerWait或User::WaitForRequest()。 | QEventLoop可用来完成这个功能:
QEventLoop eventLoop; connect(this, SIGNAL(TwmsAsyncFunctioncompleted()), &eventLoop, SLOT(quit())); eventLoop.exec(QEventLoop::ExcludeUserInputEvents); 这个也会阻塞UI事件,以防直到异步操作完成时用户还不希望处理它们。 |


(no comments yet)