*安装和启动活动调度器
*活动调度器的伪代码示例
*活动调度器的函数
*定制活动调度器
*安装和启动活动调度器
- GUI应用程序会自动安装和运行活动调度器,不用手动安装
- 对于非GUI应用程序,则需要手动创建,安装和运行活动调度器,比如
如果线程已经安装了活动调度器,再次安装会导致严重错误(E32USER-CBase43)
//创建
CActiveScheduler* mySched = new(Eleave) CActiveScheduler;
//安装
CActiveScheduler :: Install(mySched);
//添加活动对象,并且发起异步函数请求
//运行活动调度器
CActiveScheduler :: Start();
*活动调度器伪代码示例
Do
{
WaitForAnyRequest();
For (I=0; I<NUMBER_OF_ACTIVE_OBJECTS; I++)
{
IF (ACTIVE_OBJECT[i],iActive && (ACTIVE_OBJECT[I].iStatus != KRequestPending))
{
ACTIVE_OBJECT[I].RunL();
Break;
}
IF (I == NUMBER_OF_ACTIVE_OBJECTS)
{
GENERATE_STRAY_SIGNAL_EXCEPTION();
}
}WHILE(ActiveScheduler::Stop()
}
*活动调度器函数
- void Add(CActive* aActiveObject)
添加活动对象到当前的活动调度器
- Void Install(CActiveScheduler* aActiveScheduler)
安装aActiveScheduler为当前线程的活动调度器
- Void Replace(CAcitveScheduler* aACtiveSCheduler)
和Install()类似,当当前线程已经安装了活动调度器时,用aActiveScheduler取代当前活动调度器
- Void Start()
启动活动调度器,开始处理活动对象事件
- Void Stop()
退出当前活动高度器的事件循环
- CActiveScheduler* Current()
返回当前线程的活动调度器的指针
*定制活动调度器
- virtual void OnStarting()
在事件循环开始之前,由CActiveScheduler基类的Start()函数调用
- Virtual void OnStopping()
由CActiveScheduler基类的Stop()函数调用,默认实现是空
- Virtual void Error(Tint aErr)
当活动对象在RunL()函数中发生异常退出,而且活动对象的RunError()函数并没有对此做出处理时,该函数被活动对象调度器调用
默认实现是发出E32USER-CBase47异常
- Virtual void WaitForAnyRequest()
由活动对象调度器事件循环发起调用,用于等待异步函数完成
默认实现是调用User::WaitForRequest()