彻底理解 Symbian 活动对象
2010-08-24 05:50:00 来源:WEB开发网LOCAL_C void
CleanupClosePushL(timer);
User::LeaveIfError(timer.CreateLocal());
TRequestStatus status(KRequestPending);
timer.After(status, 1000000);
// 等待status对应的信号量,此处用了User::WaitForRequest方法将异步方法的调用模拟成同步
User::WaitForRequest(status);
CleanupStack::Pop(&timer);
LOCAL_C void
TBuf<10> str;
console->Write(str);
console->Write(KNewLine);
三、使用User::WaitForRequest方法的问题
User::WaitForRequest有时候不会正常运行,如:CImageDecoder::Convert方法:
IMPORT_C virtual voidTRequestStatus* aRequestStatus, CFbsBitmap& aDestination, CFbsBitmap& aDestinationMask, TInt aFrameNumber = 0);
最后一个参数必须为EOptionAlwaysThread,User::WaitForRequest才能正常执行,个人认为 CImageDecoder::Convert如果没有加EOptionAlwaysThread参数的时候是使用"长线任务"(将在下一节介绍)实现的。所以,CImageDecoder::Convert方法应该按照如下方法调用:
TRequestStatus status(KRequestPending);
CImageDecoder* decoder = CImageDecoder::FileNewL(iFs, aFileName, KMIMEType,
decoder->Convert(&status, aBitmap);
User::WaitForRequest(status);
delete decoder;
四、小结
本文介绍了在如果将异步函数同步使用。其实在Symbian的早期编程中还有一种异步函数的同步方法,那就是在异步函数调用后使用 CActiveScheduler::Start()方法嵌套活动调度器。但是这种方法已经被Symbian 7.0后的CActiveSchedulerWait替代,在此处就不再介绍。
另:在介绍活动对象的专题里涉及到很多Symbian OS的客户/服务器架构的知识,我会在近期另外开一个专题讲解,请大家耐心等待。
发表于 @ 2009年03月20日 16:30:00||举报|收藏
更多精彩
赞助商链接