技术开发 频道

Symbian 中活动对象的简单使用

  【IT168 技术】symbian官方推荐使用活动服务对象(CActive)来代替多线程的使用,我想这个道理是很明了的,在手机这样的小内存设备里,运行多线程的程序是非常耗资源的,为了节约资源,symbian提供了一个活动服务对象的框架,允许把程序里并发执行对象(其实不是并发,不过宏观上看来是)放在一个线程里面执行,这些并发工作的对象就通过活动规划器(ActiveScheduler)来进行管理.

  关于这两个东西的介绍,网上有一大堆的文档,我就不在这里废话了,如何使用呢?这里我先举一个简单的计数器的例子.我选择写一个exe的程序,也就是说程序是以E32Main为入口的.

  GLDEF_C TInt E32Main()

  {

  CTrapCleanup* cleanup=CTrapCleanup::New();

  TRAPD(error,callInstanceL());

  if (error != KErrNone)

  {

  printf("get error %d ", error);

  }

  delete cleanup;

  return 0;

  }

  以上的内容是每一个exe文件都应该做的,CTrapCleanup* cleanup=CTrapCleanup::New()建立一个清除堆栈,以便程序在异常退出的时候把清除堆栈里面的资源都释放掉.当然你也可以加上堆检测宏(__UHEAP_MARK,__UHEAP_MARKEND),这里我就不多说了。TRAPD是symbian里面经常使用的宏,功能类似于try,第一个参数是让定义一个错误返回值变量的名字, 后面就是可能有异常的你写的函数.当这个函数异常时,程序不会crash, 你可以得到异常的原因.可以参考nokia论坛上的一些关于这些使用的文档.

  接下来是vcallInstanceL函数,在这个函数里面我来建立ActiveScheduler.

  LOCAL_C void callInstanceL()

  {

  CActiveScheduler* scheduler = new(ELeave) CActiveScheduler();

  CleanupStack::PushL(scheduler);

  CActiveScheduler::Install(scheduler);

  TRAPD(error,doInstanceL());

  if(error)

  {

  printf("error code=%d ",error);

  }

  else

  {

  printf("OK! [press any key]");

  }

  CleanupStack::PopAndDestroy(scheduler);

  }

  这段程序很简单就是创建一个活动规划器,并压入清除栈,然后安装活动规划器,这样就可以用了.再执行真正的实例函数,最后出栈销毁。doinstance(该函数将在最后的代码中给出,主要的功能就是调用我们自己写的活动计数器)我们放到最后来写,现在来构造我们的活动计数器对象。

0
相关文章