技术开发 频道

Symbian 中活动对象的简单使用

  // 设定定时器状态为每隔mTime秒钟状态完成一次

  iTimer.After(iStatus, 10000 * 100 * mTime);

  // 提交异步请求

  SetActive();

  }

  void TimeCount::ConstructL()

  {

  // 初始化计数器和定时器

  iTimeCount = 0;

  User::LeaveIfError(iTimer.CreateLocal());

  }

  void TimeCount::RunL()

  {

  // 计数器+1以后继续提交延时请求事件

  printf("The Count is ->>%d", iTimeCount++);

  StartL();

  }

  每一个活动服务对象都有一个iStatus来标识当前对象的状态.在这里我们把iStatus设定为iTimer.After(iStatus, 10000 * 100 * mTime);也就是定时器定时mTime秒钟以后iStatus发生改变,这个时候活动规划器会收到这个状态的改变,从而调用相应活动对象的处理函数,也就是RunL函数.在RunL函数里面进行计数和输出,然后调用startL重新设置定时器和对象状态,再提交给活动规划器。这样mTime秒钟以后活动规划器会再次调用RunL函数.一直这样重复,这样就达到了计数器的效果。

  最后我们来写doinstanceL函数

  LOCAL_C void doInstanceL()

  {

  TimeCount* timeCount = TimeCount::NewLC();

  // 每隔一秒钟打印一次

  TimeCount->setDelayTime(1);

  TimeCount->StartL();

  CActiveScheduler::Start();

  CleanupStack::PopAndDestroy(1);

  }

  创建好对象以后,加上CActiveScheduler::Start()程序就开始运行了,这句话告诉活动规划器该等待对象的状态的改变了(正常情况下,一旦CActiveScheduler::Start()之后,程序直到CActiveScheduler::Stop()才能终止运行),在这里就是timeCount的iStatus的改变.等iStatus改变并调用了RunL以后,继续等待iStstus的改变,这样我们使用活动对象的计数器就能够通过消息驱动运行起来了.

  这里的CActiveScheduler只管理了一个CActive对象,就是timeCount,可以用类似的方法实现多个CActive,并且都加入CActiveScheduler,CActiveScheduler将会等待所有加入它的CActive的状态的改变,其中有一个的状态改变就会去执行对应的活动对象的处理函数,当状态同时发生的时候,会通过对象的优先级来决定先调用谁的RunL函数.CActiveScheduler也是非抢占式的,当一个RunL函数还没有执行完的时候,如果另一个CActive的状态改变,会等待RunL执行完以后再执行另一个CActive的处理函数(正因为这一点,所以通常RunL函数不能设计为长函数,否则会阻塞活动对象)。

0
相关文章