`
yesjavame
  • 浏览: 687130 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Symbian学习笔记(6):关于多线程与活动对象

阅读更多
symbian支持多线程(它有一个RThread类)但却又不提倡大家使用多线程,理由一般是说应用更安全?代码更简单?不过我觉得最有说服力的是省电。

既然如此,那我们就不说“多线程”,说说“多任务”吧,活动对象(Active Object)提供了非抢占式的多任务协同处理机制,它不是多线程的,而是运行在一个单线程中。

AO机制包括两个类CActiveScheduler和CActive:

调度器CActiveScheduler:顾名思义它是协调多个活动对象的调度者。既然是非抢占式的,那它的调度原则是什么呢?教材上说法是:

A) 根据活动对象的优先级顺序对已注册的所有活动对象逐个检查。
B) 判断它是否是活动的(IsActive),且它的iStatus是否不为KRequestPending。
C) 满足则执行它的RunL方法。

活动对象CActive:这可以理解为一个“线程”,就象Java中的Runable。它受调度器的指挥,它的关键在于类型为TRequestStatus的iStatus成员变量。

一般情况下在CActive中会有一个异步操作(方法形参表中包括一个TReuqestStatus类型参数),如果没有也无所谓(根据上面的调度原则,只要保证它不为KRequestPending即可)。

因为GUI应用自带了CActiveScheduler,所以我们要做的事情就是实现一个派生于CActive的子类,重载方法RunL()、DoCancel()和RunError()。当然还应该有一个类似于Start的方法来启动它。

Start负责启动,一般是在这里去执行一个异步操作(比如加载JPEG的图像,如上篇所言;或者打开一个定时器,如书上例子)。如果没有异步操作的话,也可以在这里啥事都不做。但是无论如何,它的最后一行肯定应该是SetActive(),让自己成为活动状态。

RunL负责具体的工作,如果是刚才Start了一个异步操作,此时应该处理该操作结束后的事务(如上篇中加载了图像以后就可以显示到屏幕上了)。如果刚才没有Start一个异步操作,那现在也得做点事情了。

有一种情况,我们把一个大任务分解成多个小任务,放在RunL中来做,那就得再加一个状态TInt iState来记录此次回调应该做哪一步小任务了(每完成一个小任务就改一个iState的值,并且还得再SetActive,让这个活动对象继续处于活动状态,直到所有任务完成)。

DoCancel提供了用户可以中止活动任务的手段,而RunError则提供了错误处理的机会。

另外,在这个CActive的子类中,应该有一个地方(一般是在ConstructL中)将自己放入调度器的队列中,即调用CActiveScheduler::Add(this)。

帖一段代码,就是上篇加载JPEG图像的代码应该放在一个AO中来实现,利用向导生成一个CActive的子类:
classCImageLoader:publicCActive
...{
public:
~CImageLoader();

//Two-phasedconstructor.
staticCImageLoader*NewL(CDemoUIAppView*p);
staticCImageLoader*NewLC(CDemoUIAppView*p);

public://Newfunctions
voidStartL();

private:
CImageLoader();
voidConstructL();

private://FromCActive
voidRunL();
voidDoCancel();
TIntRunError(TIntaError);
private:
RFsiRFs;
CDemoUIAppView
*iParent;
CImageDecoder
*iDec;
}
;

cpp中的实现更简单了,在StartL中负责刚才的加载jpeg图像(主要是它有一个异步调用),在RunL中负责重绘CDemoUIAppView的界面即可。
voidCImageLoader::StartL()
...{
Cancel();
//Cancelanyrequest,justtobesure

if(iDec)
iDec
->Cancel();
deleteiDec;
iDec
=NULL;

iDec
=CImageDecoder::FileNewL(iRFs,KJPEGFile);

iParent
->iBkImageMask=new(ELeave)CFbsBitmap();
iParent
->iBkImageMask->Create(iDec->FrameInfo().iOverallSizeInPixels,iDec->FrameInfo().iFrameDisplayMode);
iDec
->Convert(&iStatus,*(iParent->iBkImageMask));

SetActive();
//Tellschedulerarequestisactive
}


voidCImageLoader::RunL()
...{
if(iParent)
iParent
->DrawNow();
}


分享到:
评论

相关推荐

    symbian学习笔记(超级经典-适用于初学者)

    本学习笔记旨在为初学者提供全面、细致的Symbian操作系统知识,帮助你快速入门并深入理解其工作原理。 一、Symbian系统概述 Symbian操作系统最初由英国的EPOC公司开发,后被诺基亚收购并成为其主要的操作系统平台。...

    Symbian学习笔记

    6. **多线程与活动对象**: Symbian的并发编程依赖于活动对象(Active Objects),这是一种处理异步事件的机制。这部分可能涵盖了活动对象的创建、调度和同步。 7. **定时器**: 定时器在Symbian中用于定期触发...

    symbian学习笔记,全28讲

    在后续的笔记中,可能涵盖Symbian操作系统的基础概念、S60平台特性、UI设计、应用程序编程接口(API)使用、内存管理、线程与同步、网络编程、数据库访问、设备访问、系统服务调用等多个方面。此外,还会涉及到调试...

    Symbian学习笔记(中国移动开发者社区).pdf

    - **多线程编程**: 适当使用多线程技术提高程序的响应速度和执行效率。 ### 4. Symbian 基础知识 #### 4.1 Symbian 架构概述 - **用户界面层**: 提供了丰富的 UI 控件和交互功能。 - **服务层**: 包括文件系统、...

    symbian 学习笔记

    1. **线程与进程管理**:Symbian支持多线程和多进程模型,每个应用程序可以包含多个线程,线程间通信通过消息队列或共享内存实现。 2. **内存管理**:Symbian采用自动垃圾回收机制,但开发者仍需谨慎处理内存分配和...

    真正的Symbian笔记.docx

    以上知识点构成了Symbian笔记的主要内容,通过学习这份笔记,开发者不仅可以理解Symbian操作系统的运作原理,还能掌握实际开发中的技巧和最佳实践。虽然Symbian系统现在已不流行,但其设计理念和许多技术仍对现代...

    21简单GUI编程1 张锦锋Symbian讲座

    7. **多线程编程**:在Symbian中,多线程常用于实现UI与后台任务的分离,提高程序响应性和性能。 8. **设备兼容性**:Symbian系统在不同硬件上的表现可能有所不同,因此开发者需要考虑不同设备的兼容性问题。 通过...

    symbian坦克游戏源码

    通过分析这个源码,开发者可以学习到如何在Symbian系统上处理图形渲染、用户交互、游戏逻辑、内存管理以及多线程编程等核心技能。 【压缩包子文件的文件名称列表】虽然没有具体的文件名,但通常一个游戏源码包会...

    Symbian S60实例代码

    在本文中,我们将深入探讨与"Symbian S60实例代码"相关的知识,这是一个针对Symbian操作系统S60平台的编程实践。Symbian是一个经典的移动操作系统,曾广泛应用于诺基亚等早期智能手机,而S60是其上一个流行的用户...

    小糊涂学symbian日记pdf版

    通过学习,你可以了解到Symbian系统的核心架构,包括其微内核设计、多任务处理能力以及对硬件资源的有效管理。 接着,笔记深入浅出地讲解了Symbian的编程环境,如 Carbide.c++ IDE 和 Qt Creator,这些工具是开发者...

    VideoPlayer源码

    6. **线程与并发**:在Symbian平台上如何处理多线程,保证播放的流畅性。 7. **事件驱动编程**:Symbian的事件循环和信号量机制。 8. **文件I/O**:读取和操作媒体文件,如.mp4、.avi等。 9. **性能优化**:针对...

    我的Symbian编程回忆录

    接着,作者转向了QtSDK和SymbianSDK,其中Qt是一个跨平台的应用程序框架,它在SymbianSDK基础上提供了一层封装,允许开发者编写能在多个平台运行的代码。 在探索Qt的过程中,作者遇到了编译和运行问题,尤其是与...

Global site tag (gtag.js) - Google Analytics