symbian 活动对象的时候(如果实现一个长期运行的活动对象)

Symbian活动对象详解
本文介绍了Symbian系统中活动对象的应用场景及其实现方式,包括与RTime类配合使用、结合异步函数以及实现长时间运行的任务。文章还提供了详细的代码示例,帮助读者深入理解活动对象的工作原理。

活动对象在symbian中应该来说是使用比较常用的一中机制,在这里总结下使用活动对象的几种方式。

活动对象的定义:一种模拟多线程实现多任务的一种机制,简单的理解应该是这样的。

具体使用:

1。配合RTime类来使用,基本上很多书上都是这么写(白皮书上就是这么讲的),我在这里就不多说。

2。配合一些异步函数。比如写文件的时候用到的Write函数,原型是:
 IMPORT_C void Write(const TDesC8 &aDes, TRequestStatus &aStatus);

 可以看到这里的参数和其他的几个函数有点差别,这里有个TRequestStatus &aStatus参数,于是我们就联想到,这个参数在活动对象中有用到。
 用法如下:
 a。激活活动对象
 void CAsyncFile::FileWrite(const TDesC8& aDes)
 {
 TInt pos = 0;
 iFile.Seek(ESeekEnd, pos);
 iFile.Write(aDes, iStatus);
 SetActive();
 }
 b.处理活动对象的RunL函数
 void CAsyncFile::RunL()
 {
  switch(iStatus.int())
  {
  case KErrNone:
  //do something
  break;
  }
 }
 c.往后的一些处理都和1中的一样
 
 还有比如连网的时候使用的IMPORT_C void RConnect::Start(TConnPref &aPref, TRequestStatus &aStatus);都是如同2中的使用方法
 
3。长时间的运行任务,用活动对象实现。我如要是为了说下这种方法所以第1和2都讲的比较简单

这种方法应该也是常用的,但是可以网上资料没有这么实现的,贴下详细代码:
 a。活动对象的.h
 class CAoTest : public CActive
   {
  private:
   void RunL();
   TInt RunError(TInt aError);
   void DoCancel();
  public:
   CAoTest();
   ~CAoTest();
   void Start();
   };
  
  b.活动对象的.cpp
  CAoTest::CAoTest() : CActive(EPriorityStandard)
   {
   CActiveScheduler::Add(this);
   }
  
  CAoTest::~CAoTest()
   {
   Cancel();
   }
   /*
   在调用Start函数后会掉用这个函数,我们在这里做了些处理,这样直接让活动对象调用完RunL函数后,
   后再次调用RunL()函数,实现一个长期运行的活动对象
   */
  void CAoTest::RunL()
   {
   TRequestStatus *myStatus = &iStatus;
   User::RequestComplete(myStatus,KErrNone);
   SetActive();
   }
   /*
   处理取消活动对象,一般情况下可以这么写,都的时候需要空着,具体在使用的时候再体会吧
   */
  void CAoTest::DoCancel()
   {
  
   TRequestStatus* pS = &iStatus;
   User::RequestComplete(pS, KErrCancel);
   
   }
   /*
   启动函数,调用启动活动对象。这里需要注意的是需要设置iStatus这个值,直接设置为KRequestPending
   也可以,但是一般不推荐这样直接赋值(初始化的时候可以这样),容易出现E32Ueser-cbase 46(出现游
   离信号),可以像我下面那样设置
   */
  void CAoTest::Start()
   {
  
  // Cancel();
   TRequestStatus* pS = &iStatus;
   User::RequestComplete(pS, KErrNone);
   if(!IsActive())
    SetActive();
   }
   /*
   处理Runl的异常退出,因此在Runl中就不用使用TRDP等异常处理的机制来处理异常了
   */
  TInt CAoTest::RunError(TInt aError)
   {
   TInt nerr = aError;
   return nerr;
   }
  
  CHelloWorldA0AppView* CHelloWorldA0AppView::NewL(const TRect& aRect)
   {
   CHelloWorldA0AppView* self = CHelloWorldA0AppView::NewLC(aRect);
   CleanupStack::Pop(self);
   return self;
   }
   
   c.使用活动对象
   直接建立一个Hello world的GUI工程
   然后在cantainer中 定义个成员
   CAoTest *iaoTest;
   然后在cantainer的ConstructL中实例化
   
   void CHelloWorldA0AppView::ConstructL(const TRect& aRect)
   {
   // Create a window for this application view
   CreateWindowL();
   
   iaoTest = new CAoTest;
   // Set the windows size
   SetRect(aRect);
  
   // Activate the window, which makes it ready to be drawn
   ActivateL();
   
   iaoTest->Start();
   }
   
   这个时候可以debug下单步运行,在RunL函数看见会不停的回调这个函数。这个时候一个长期运行的活动对象就成功实现
   
   
   
一般会遇到的问题问题:
   1。一般在使用活动对象的时候遇到的比较常见的panic就是E32Ueser-cbase 46,对应的问题是说游离的信号,
   2。一般可能会出现游离信号的情况是:
    a.忘记激活活动对象,意思是忘记调用SetActive
    b.忘记初始化iStatus为KRequestding
    c.出现两次请求或者完成了两次请求,这种情况一般是 因为手动设置iStatus造成的
   3.活动对象中不要直接调用DoCancel,而应该通过调用Cancel来间接的调用DoCancel
   4.活动对象析构的时候一般都是会调用Cancel函数的
   
   

多角色体系 支持管理员、商家、消费者三种角色,权限分级管控: 管理员:负责平台整体配置、用户审核、数据监控等全局操作。 商家:管理店铺信息、发布商品、处理订单、回复评价等。 消费者:浏览商品、加入购物车、下单支付、评价商品等。 实现用户注册(手机号 / 邮箱验证)、登录(支持密码 / 验证码 / 第三方登录)、个人信息管理(头像、收货地址、密码修改)。 权限精细化控制 商家仅能管理自家店铺及商品,消费者仅能查看和购买商品,管理员拥有全平台数据访问权限。 二、商品管理功能 商品信息维护 商家可发布商品:填写名称、分类(如服饰、电子产品)、子类别(如手机、笔记本)、规格(尺寸、颜色、型号)、价格、库存、详情描述(图文)、物流信息(运费、发货地)等。 支持商品上下架、库存调整、信息编辑,系统自动记录商品状态变更日志。 商品分类与搜索 按多级分类展示商品(如 “数码产品→手机→智能手机”),支持自定义分类体系。 提供智能搜索功能:按关键词(名称、品牌)搜索,支持模糊匹配和搜索联想;结合用户浏览历史对搜索结果排序(优先展示高相关度商品)。 商品推荐 基于用户浏览、收藏、购买记录,推荐相似商品(如 “浏览过该商品的用户还买了…”)。 首页展示热门商品(销量 TOP10)、新品上架、限时折扣等推荐列表。 三、订单与交易管理 购物车与下单 消费者可将商品加入购物车,支持修改数量、选择规格、移除商品,系统自动计算总价(含运费、折扣)。 下单流程:确认收货地址→选择支付方式(在线支付、货到付款)→提交订单→系统生成唯一订单号。 订单处理流程 订单状态跟踪:待支付→已支付→商家发货→物流运输→消费者收货→订单完成,各状态变更实时通知用户。 商家端功能:查看新订单提醒、确认发货(填写物流单号)、处理退款申请(需审核理由)。 消费者端功能:查看订单详情、追踪物流、申请退款 / 退货、确认收货。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值