Symbian学习笔记(6)——关于多线程与活动对象
2009-03-17 11:45
387 查看
symbian支持多线程(它有一个
class CImageLoader : public CActive
...{
public:
~CImageLoader();
// Two-phased constructor.
static CImageLoader* NewL(CDemoUIAppView *p);
static CImageLoader* NewLC(CDemoUIAppView *p);
public: // New functions
void StartL( );
private:
CImageLoader();
void ConstructL();
private: // From CActive
void RunL();
void DoCancel();
TInt RunError( TInt aError );
private:
RFs iRFs;
CDemoUIAppView *iParent;
CImageDecoder *iDec;
};
cpp中的实现更简单了,在StartL中负责刚才的加载jpeg图像(主要是它有一个异步调用),在RunL中负责重绘CDemoUIAppView的界面即可。
void CImageLoader::StartL( )
...{
Cancel(); // Cancel any request, just to be sure
if(iDec)
iDec->Cancel();
delete iDec;
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(); // Tell scheduler a request is active
}
void CImageLoader::RunL()
...{
if(iParent)
iParent->DrawNow();
}
引用自:http://www.sf.org.cn/Article/lumen/200803/20914.html
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的子类:
class CImageLoader : public CActive
...{
public:
~CImageLoader();
// Two-phased constructor.
static CImageLoader* NewL(CDemoUIAppView *p);
static CImageLoader* NewLC(CDemoUIAppView *p);
public: // New functions
void StartL( );
private:
CImageLoader();
void ConstructL();
private: // From CActive
void RunL();
void DoCancel();
TInt RunError( TInt aError );
private:
RFs iRFs;
CDemoUIAppView *iParent;
CImageDecoder *iDec;
};
cpp中的实现更简单了,在StartL中负责刚才的加载jpeg图像(主要是它有一个异步调用),在RunL中负责重绘CDemoUIAppView的界面即可。
void CImageLoader::StartL( )
...{
Cancel(); // Cancel any request, just to be sure
if(iDec)
iDec->Cancel();
delete iDec;
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(); // Tell scheduler a request is active
}
void CImageLoader::RunL()
...{
if(iParent)
iParent->DrawNow();
}
引用自:http://www.sf.org.cn/Article/lumen/200803/20914.html
相关文章推荐
- Symbian学习笔记(6):关于多线程与活动对象
- Symbian学习笔记(22) - 关于皮肤的小结
- 关于多线程中单例模式的使用学习笔记
- 关于Redis五种类型对象的学习笔记
- Spring学习笔记——关于Spring注解扫描不能注入new对象问题
- 黑马程序员-IOS学习笔记 OC 关于对象方法类方法的一些概念
- Symbian学习笔记(6)——关于多线程与活动对象
- 关于多线程学习的笔记
- 关于多线程与活动对象
- Inside The C++ Object Model 学习笔记 -- 关于对象
- 学习JAVA多线程编程 --- 《JAVA多线程编程核心技术》第2章 对象及变量的并发访问 笔记
- 【DAY8】关于多线程的学习笔记
- 关于自己对象学习的碎片化笔记
- 关于LUA程序设计对象序列化学习笔记
- Java学习笔记(84)----------关于 Java 对象序列化你不知道的 5 件事
- J2ME学习笔记--关于多线程,集合,lang,util的思考
- 【DAY9】关于多线程的学习笔记
- Java学习笔记~关于类与对象的总结01
- 我的java学习笔记(5)关于对象构造
- cocos2d-x 3.1.1 学习笔记[17] 关于这些活动功能