需求:
因为载入短信收件箱中的所有短信可能会花费较长时间,因此考虑把这个过程放入到一个线程中执行,因为每条短信读出来都会生成自定义的结构,因此要逐条处理。这样做的目的也是为了在逐条载入的过程中,可以对外显示一个进度条,报告载入的进度。
过程:
在尝试过程中,采用了《Symbian OS C++ 高效编程》中第十章的例子:CAsyncTask来封装短信读取流程。
封装完毕,编译通过(此前我已经采用阻塞流程完整读出过短信列表,因此对这块的知识储备充足)。
运行后出现E32USER -CBASE 46的Panic,多方跟踪,最后确定是子线程引用了主线程中的对象,当然:CMsvSession, SmsMtm我都计划创建一次,而读取过程可能在软件的生命周期中会被反复调用。
首先发现在线程中不能调用主线程的数据。
查资料后发现可以给线程传递参数,使子线程与主线程共享数据,于是采用之传递Session和MTM进来,同样一到使用这个的地方就退出。
最后我想,我不共享了,完全创建一套,使用完了释放,结果在子线程中,创建也是不可以的:
iSession = CMsvSession::OpenSyncL(*this);
这句直接异常,而且异常基本相同。
然后又查阅资料,CMsvSession可能使用到了RFs,而RFs想要在线程中共享,需要做点额外的操作(根据文档来的,好像是啥啥Auto)。显然我们不可能控制CMsvSession的RFs,我也考虑过通过OpenSyncL的重载函数输入RFs,可是,不知道输入那个。而且,这只是我的猜测,如果Session用到了很多系统资源,如iCoeEnv,那就更复杂了。
结论:
暂时保持目前短信载入模式。
收获:
对AO及线程有了初步的理解和经验。