CActive

 

symbian:异步处理请求的操作系统,应用程序不能直接访问系统资源。

当要访问系统资源时,先向资源服务器发起连接,建立会话,然后把对资源的访问请求通过会话发送给服务器,服务器负责执行用户请求的操作,然后把执行结果返回给用户。

symbian os中使用活动对象发布异步请求,在单线程中实现非抢占式多任务。-模拟多线程。

//---------------------------------------------------------
活动对象调度器-CActiveScheduler
(相当于Windows程序中的主消息循环)
用来调度程序中建立的活动对象。


IMPORT_C static void Install(CActiveScheduler* aScheduler);

IMPORT_C static void Add(CActive* anActive);
IMPORT_C static void Start();
IMPORT_C static void Stop();
//---------------------------------------------------------

活动对象 -CActive

class CActive : public CBase
{
public:
enum TPriority
{
EPriorityIdle=-100,
EPriorityLow=-20,
EPriorityStandard=0,
EPriorityUserInput=10,-------------?
EPriorityHigh=20,
};
public:
IMPORT_C ~CActive();
IMPORT_C void Cancel();-------------------
IMPORT_C void Deque();
IMPORT_C void SetPriority(TInt aPriority);
inline TBool IsActive() const;--------------?
inline TBool IsAdded() const;
inline TInt Priority() const;
protected:
IMPORT_C CActive(TInt aPriority);
IMPORT_C void SetActive();
// Pure virtual
virtual void DoCancel() =0;-----------------------?
virtual void RunL() =0;----------------------------?
IMPORT_C virtual TInt RunError(TInt aError);-----------------
public:
TRequestStatus iStatus;-------------------!!!它用于指示异步服务的完成状态
private:
TBool iActive;-----------------------!!!!表示该活动对象是否处于活动状态
TPriQueLink iLink;
friend class CActiveScheduler;
friend class CServer;
friend class CServer2;
};
//---------------------------------------------------------
RunL()何时被调用?
完成后
iStatus置为非KRequestPending状态,一般是KErrNone,然后活动对象调度器会调用iStatus的活动RunL(),完成异步请求。

DoCancel()何时被调用?
发布请求后,没有完成前
可以调用活动对象的Cancel()方法取消未完成的请求。Cancel()内部会调用自己的DoCancel(),进行一些取消清理工作。
//---------------------------------------------------------
活动对象的生命周期????
工作顺序
1,创建安装活动对象调度器

2,创建活动对象类

3,由活动对象的发出异步请求的方法--发出异步请求(异步请求函数,需要传iStatus成员)
     --<发送请求之前应该调用IsActive()函数检查活动对象的状态,如果已经处于活动状态就不要在发送了。>
设置iStatus到KRequestPenging状态--SetActive()--iActive置为ETure|||
4,启动活动对象调度器,()

5,请求完成,|||异步请求函数把iStatus设置为KErrNone<不用程序员去管理>,通知调度器。


6,调度器调用活动对象的RunL()通知活动对象请求已经完成。

7.RunL()异常,调度器会调用重载的RunRrror函数。--活动调度器会捕捉RunL()函数抛出的异常,并调用活动对象RunError()函数处理该异常。
//---------------------------------------------------------

实现活动对象的步骤
1,实现活动对象的的派生
2,活动对象类的构造中,设置优先级:CActive(EPriorityStandard)几个活动对象同时完成时,优先级高的优先调用
3,活动对象的二步构造中。异步服务提供者的构造,    添加到活动对象调度器中。CACtiveScheduler::add(this)
4,实现CActive类的3个虚函数 RunL(),DoCancel(),RunError()
5,实现活动对象的析构,调用活动对象继承来的Cancel()取消发出的异步请求!,销毁异步服务器提供者

//---------------------------------------------------------
注意事项:

同时可以在多个活动对象上发布异步请求,但每个活动对象每次只能发出一个异步请求!


活动对象主要用于封装程序中的异步请求操作,所有的多动对象都必须从CActive类派生

非抢占式的,即当一个活动对象的RunL()执行时,活动调度器就无法分发其他异步事件,因此两个活动对象不会同时运行。
Cancel()函数首先检查活动标记,如果活动对象处于活动状态则调用DoCancel()取消异步请求,然后将活动标记为EFalse。活动对象应该在析构函数里调用Cancel()函数取消异步请求。
exe 或 dll里需要安装活动对象调度器
活动对象发出请求时,此时必然不能有一个请求已经发出还没有完成(活动状态),如果有,需要首先取消(Cactive::Cancel)
在构造函数加入到活动对象调度器里
活动对象本身是种框架,并不真正具有异步函数,发出请求不是活动对象。
任何活动对象析构函数的第一步都是调用Cancel()删除任何未完成的请求。

//---------------------------------------------------------
练习:
CFileWrite::Public CActive
{
public:
NewL();
~CFileWrite();

WriteL(TDesC& aDec);

RunL();
DoCancel();
RunError();


protected:
RFile iFile;
RFs fs;//
TFileName iFileName;

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值