Symbian中使用活动对象的三种典型设计(转载)

Symbian中使用活动对象的三种典型设计
 
发表时间:2008-12-18 2:12:59  浏览次数:214
 
    Symbian中活动对象的使用是很频繁的(活动对象的理论我不多说了,关心的朋友自己去查资料,跟Windows平台中的ActiveX对象一个样,对事件的驱动和处理过程也跟它一样,或者说,举个简单的例子,跟Ajax的异步传输一样.因为Symbian的活动对象本来就是用于异步请求的事件处理的).使用活动对象的典型方式我认为有三个:
    1.状态机(通俗的说就是在同一线程同一活动对象中处理多步骤的异步请求)
class CServiceProvider : public CBase {
public:
    static CServiceProvider * NewL();
    ~CServiceProvider() {};
public:
    void GetData(const TDesC& aSource, HBufC8 * aData, TRequestStatus & aStatus);
    void CancelGetData();
    TInt TranslateData(TDes8 & aData);
    void SendData(const TDesC & aTarget, const TDesC8 & aData, TRequestStatus & aStatus);
    void CancelSendData();
protected:
    CServiceProvider() {};
};
void CServiceProvider :: GetData(const TDesC & aSource, HBufC8 * aData, TRequestStatus & aStatus) {
    aStatus = KRequestPending;
    // 用RFile::Read()的异步重载形式从aSource中获取数据,并写入aData(如果必要,对其
    // 重新分配空间),当读取完成,则由文件服务器将aStatus标为完成状态
}
void CServiceProvider :: CancelGetData() {...}
void CServiceProvider :: TranslateData(TDes8 & aData) {
    // 同步解析数据并写入同一个描述符中
    ...
    return translationResult;
}
void CServiceProvider :: SendData(const TDesC & aTarget, const TDesC8 & aData, TRequestStatus & aStatus) {
    aStatus = KRequestPending;
    // 用RFile::Write()的异步重载形式向aTarget中写入数据,该函数在完成时设置aStatus状态
    ...
}
void CServiceProvider :: CancelSendData() {...}
const TInt KStandardDataLen = 1024;
class CStateMachine : public CActive {
public:
    ~CStateMachine();
    state CStateMachine * NewLC();
    void SendTranslatedDate(const TDesC & aSource, const TDesC & aTarget, TRequestStatus &);
protected:
    enum TState {EIdle, EGet, ETranslate, ESend};
protected:
    CStateMachine();
    void InitializeL(const TDesC & aTarget);
    void Cleanup();
protected:
    virtual void DoCancel();
    virtual void RunL();
    // RunError()我没有实现,因为RunL()在这个例子中不会Leave,但是这个声明是必须的(受C++语法限制)
    virtual TInt RunError(TInt aError);
private:
    CServiceProvider * iService;
    TState iState;
private:
    HBufC * iTarget;
    HBufC8 * iStorage;
    TRequestStatus * iClientStatus;
};
CStateMachine :: CStateMachine() : CActive(EPriorityStandard) {
    CActiveScheduler :: Add(this);
}
CStateMachine :: ~CStateMachine() {
    Cancel();
    Cleanup();
}
void CStateMachine :: InitializeL(const TDesC & aTarget) {
    // 将其保存起来,后面传递给CServiceProvider
    iTarget = aTarget.AllocL();
    // 保存接收到的数据
    iStorage = HBufC8::NewL(KStandardDataLen);
}
void CStateMachine :: Cleanup() {
    iState = EIdle;
    delete iTarget;
    iTarget = NULL;
    delete iStorage;
    iStorage = NULL;
}
void CStateMachine :: SendTranslatedData(const TDesC & aSource, const TDesC & aTarget, TRequestStatus & aStatus) {
    __ASSERT_ALWAYS(!IsActive, User::Panic(KExPanic, KErrInUse));
    ASSERT(EIdle == iState);
    iClientStatus = &aStatus;
    *iClientStatus = KRequestPending;
    TRAPD(r, InitializeL(aTarget));
    if(KErrNone != r) {
        Cleanup();  
        User::RequestComplete(iClientStatus, r);
    } else {
        iService -> GetData(aSource, iStorage, iStatus);
        iState = EGet;
        SetActive();
    }
}
void CStateMachine :: RunL() {
    ASSERT(EIdle != iState);
    if(KErrNone != iStatus.Int()) {
        User :: RequestComplete(iClientStatus, iStatus.Int());
        Cleanup();
    } else {
        if(EGet == iState) {
            TPtr8 ptr(iStroage.Des());
            iService -> TranslateData(ptr);
            iState = ETranslate;
            TRequestStatus * stat = &iStatus;
            User::RequestComplete(stat, r);
            SetActive();
        } else if(ETranslate == iState) {
            TInt r = iService -> SendData(*iTarget, *iStorage, iStatus);
            iState = ESend;
            SetActive();
        } else {
            ASSERT(ESend == iState);
            User :: RequestComplete(iClientStatus, iStatus.Int());
            Cleanup();
        }
    }
}
void CStateMachine :: DoCancel() {
    if(iService) {
        if(CStateMachine :: EGet == iState) {
            iService -> CancelGetData();
        } else if(CStateMachine :: ESend == iState) {
            iService -> CancelSendData();
        }
    }
    if(iClientStatus) {
        User :: RequestComplete(iClientStatus, KErrCancel);
    }
}
    2.长线任务(通俗的说,也就是在一个优先级低的活动对象中持续处理一个分成很多步的任务,这些任务可以不是异步的,每个步骤之间是自驱动或者叫自完成的)
class CLongRunningCalculation : pulbic CBase {
public:
    static CLongRunningCalculation * NewL();
    TBool StartTask();
    TBool DoTaskStep();
    void EndTask();
    ...
};
TBool CLongRunningCalculation :: DoTaskStep() {
    // 执行一个任务步骤,如果还有任务要做则返回ETrue,如果任务完成了,返回EFalse
}
_LIT(KExPanic, "CActiveExample");
class CBackgroundRecalc : public CActive {
public:
    // NewL,析构函数等
public:
    void PerformRecalculation(TRequestStatus & aStatus);
protected:
    CBackgroundRecalc();
    void ConstructL();
    void Complete();
    virtual void RunL();
    virtual void DoCancel();
private:
    CLongRunningCalculation * iCalc;
    TBool iMoreToDo;
    TRequestStatus * iCallerStatus;
};
CBackgroundRecalc :: CBackgroundRecalc() : CActive(EPriorityIdle) {
    CActiveScheduler :: Add(this);
}
void CBackgroundRecalc :: PerformRecalculation(TRequestStatus & aStatus) {
    iCallerStatus = &aStatus;
    *iCallerStatus = KRequestPending;
    __ASSERT_ALWAYS(!IsActive(), User :: Panic(KExPanic, KErrInUse));
    iMoreToDo = iCalc -> StartTask();
    Complete();
}
void CBackgroundRecalc :: Complete() {
    TRequestStatus * status = &iStatus;
    User :: RequestComplete(status, KErrNone);
    SetActive();
}
void CBackgroundRecalc :: RunL() {
    if(!MoreToDo) {
        iCalc -> EndTask();
        User :: RequestComplete(iCallerStatus, iStatus.Int());
    } else {
        iMoreToDo = iCalc -> DoTaskStep();
        Complete();
    }
}
void CBackgroundRecalc :: DoCancel() {
    if(iCalc) {
        iCalc -> EndTask();
    }
    if(iCallerStatus) {
        User :: RequestComplete(iCallerStatus, KErrCancel);
    }
}
    3.多线程(通俗的说,就是活动对象开启另外一个线程来处理请求,这样不会阻塞某些重要的请求完成)
_LIT(KThreadName, "ExampleThread");
TInt SynchronousTask();
class CAsyncTask : public CActive {
public:
    ~CAsyncTask();
    static CAsyncTask * NewLC();
    void DoAsyncTask(TRequestStatus & aStatus);
protected:
    virtual void DoCancel();
    virtual void RunL();
    virtual TInt RunError(TInt anError);
private:
    CAsyncTask();
    void ConstructL();
private:
    TRequestStatus * iCaller;
    RThread iThread;
};
CAsyncTask :: CAsyncTask() : CActive(EPriorityStandard) {
    CActiveScheduler :: Add(this);
}
CAsyncTask :: ~CAsyncTask() {
    Cancel();
}
void CAsyncTask :: DoAsyncTask(TRequesStatus & aStatus) {
    if(IsActive()) {
        TRequestStatus * status = &aStatus;
        User :: RequestComplete(status, KErrAlreadyExits);
        return;
    }
    iCaller = &aStatus;
    TInt res = iThread.Create(KThreadName, ThreadEntryPoint, KDefaultStackSize, NULL, NULL);
    if(KErrNone != res) {
        User :: RequestComplete(iCaller, res);
    } else {
        *iCaller = KRequestPending;
        iStatus = KRequesPending;
        SetActive();
        iThread.Logon(iStatus);
        iThread.Resume();
    }
}
TInt CAsyncTask :: ThreadEntryPoint(TAny * /* aParameters */) {
    TInt res = SynchronousTask();
    RThread().Kill(res);
    return KErrNone;
}
void CAsyncTask :: DoCancel() {
    TExitType threadExitType = iThread.ExitType();
    if(EExitPending == threadExitType) {
        iThread.LogonCancel();
        iThread.Kill(KErrCancel);
        iThread.Close();
        User :: RequestComplete(iCaller, KErrCancel);
    }
}
void CAsyncTask :: RunL() {
    TExitType threadExitType = iThread.ExitType();
    if(EExitPending == threadExitType) {
        iThread.Kill(KErrNone);
    }
    User :: RequestComplete(iCaller, iStatus.Int());
    iThread.Close();
}
TInt CAsyncTask :: RunError(TInt anError) {
    if(iCaller) {
        User :: RequestComplete(iCaller, anError);
    }
    return KErrNone;
}
 

  (珩兰 的分类目录 [我的图书馆]) ?
相关文章Symbian OS:活动对象与活动调度器2006-10-27     沧海九粟
下载http页面2007-05-22     不再幻想
Socket模拟Http连接 之 初识Socket2009-08-22     chen8864
如何读取图片2009-08-22     chen8864
Symbian中的动态集合Rarray的使用(页 1) - Sy...2007-11-30     wstone

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的课程作业管理系,源码+数据库+开题报告+论文答辩+毕业论文+视频演示 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot框架构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结,得出系统存在的不足及需要改进的地方,为以后的系统维护提供了方便,同时也为今后开发类似系统提供了借鉴和帮助。这种个性化的网上管理系统特别注重交互协调与管理的相互配合,激发了管理人员的创造性与主动性,对课程作业管理系统而言非常有利。 本课程作业管理系统采用的数据库是Mysql,使用springboot框架开发。在设计过程,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 1、关于课程作业管理系统的基本要求: (1)功能要求:可以管理首页、个人心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理、作业提交管理、作业评分管理、课程评价管理、课程资源管理等功能模块。 (2)性能:在不同操作系统上均能无差错实现在不同类型的用户登入相应界面后能不出差错、方便地进行预期操作。 (3)安全与保密要求:用户都必须通过注册、登录才能进入系统,并且用户的权限也需要根据用户的类型进行限定。 (4)环境要求:支持多种平台,可在Windows系列、Vista系统等多种操作系统下使用。 关键词:课程作业管理系统,springboot框架; Mysql数据库 Java技术
毕业设计,基于SpringBoot+Vue+MySQL开发的旅游网站,源码+数据库+开题报告+论文答辩+毕业论文+视频演示 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理难度变低了,还提升了旅游网站的灵活性。这种个性化的旅游网站特别注重交互协调经营与管理的相互配合,激发了管理人员的创造性与主动性,对旅游管理的管理而言非常有利。 本文首先分析了旅游网站的发展背景和意义,简要阐述了旅游网站系统开发的主要内容和优势,然后简要介绍了国内外旅游网站系统的研究和应用现状,并对系统开发技术,系统分析和总体设计,实现详细功能等。 本旅游网站系统采用的数据库是MySQL,使用Java技术开发,在设计过程,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 关键词:旅游网站;Java;SpringBoot; Vue; MySQL 数据库 旅游网站主要功能如下: 1.用户管理:注册、登录、退出、修改密码; 2.分类显示:显示旅游路线的分类; 3.旅游路线显示:按分类查询旅游路线、通过关键字搜索旅游路线、查看旅游路线的详细信息; 4.购物车管理:向购物车添加旅游路线、修改购物车旅游路线数量、删除购物车旅游路线、我的购物车; 5.订单管理:通过购物车生成订单、查看我的订单、查看某个订单的详细、订单支付、取消未付款订单。 6.首页:提供一个网站首页,该网站用户的登录,注册,所有旅游路线的一级分类,热门旅游路线和最新旅游路线的展示等。 7.旅游路线管理:旅游路线的上架、下架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值