Symbian中如何转换异步操作为同步操作

因为Symbian中的一个核心思想是利用单线程中的活动对象来实现多线程操作,所以我们经常会遇到很多操作是用活动对象完成的。大多数情况下,正如 Symbian推荐的一样,使用活动对象有很多好处,开销更小,更快。但是,在实际操作中给开发者带来的难度也不小,不过这也是嵌入式开发的一个通病。
最不可思议的事情是有很多很明显的同步事件竟然也要用异步完成,如图像的编码解码,取得IMEI,这些操作很多情况下都是需要即时处理的,如果用异步操作有时候感觉很奇怪。
这里我对现有的异步操作转换为同步操作的方法做一个简单介绍:
第一种是使用User::WaitForRequest(),这也是Symbian推荐的一种方法,比较简单,在很多情况下比较方便。很多书里面都有介绍。这里我就不多说了。
第二种是使用
CActiveSchedulerWait *iWait;
iWait->Start();
aWait->AsyncStop();
为什么要使用CActiveSchedulerWait呢?因为很多情况下使用第一种方法会出现得不到响应的情况,就是始终卡在WaitForRequest上,这个现象我们会在下一篇文章中进行介绍。
那么如何使用CActiveSchedulerWait呢,关键是理解他的原理。CActiveSchedulerWait与 CActiveScheduler是合作使用的,所以你必须已经安装CActiveScheduler并开启,这在GUI程序中并不困难,因为一般架构默认生成,在exe中就需要好好安排。
首先初始化一个CActiveSchedulerWait,然后在你的异步对象函数后调用,例如
iImageEncoder->Convert( &iStatus, *iBitmap );
SetActive();
iWait->Start();
这样程序就会卡在这里等待异步事件完成。
但是当异步事件完成后,你必须通知aWait->AsyncStop();
这行函数应该在iImageEncoder的RunL中调用,它会通知iWait停止等待。
这样就成功了。
在第三版中如果iWait->Start();//Panics with KERN-EXEC 3
多半是mmp文件中EPOCSTACKSIZE 的设置不对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值