`
love19820823
  • 浏览: 931022 次
文章分类
社区版块
存档分类
最新评论

问活动对象的知识,一个QQ好友的回答

 
阅读更多


178100907 11:09:29
在有界面程序下,你的大部分代码都是在某个AO的RunL下运行的
咖啡屋主人 11:09:41

symbian交流 11:12:14
并且有界面程序是利用创建唯一的CEikonEnv实例进行所有AO的管理,CEikonEnv创建了一个CCoeScheduler的唯一实例,是CActiveScheduler的派生类的派生类。
symbian交流 11:12:20
==,我要大解
咖啡屋主人 11:14:05
ok

symbian交流 11:18:28
回来了,我找一下那个官方代码,==
咖啡屋主人 11:18:39
好的,谢谢了

:je橡胶:ej 11:21:25
接收文件成功,保存于C:/Documents and Settings/Administrator/My Documents/My QQ Files/HK_Symbian Development Foundation.pdf。
symbian交流 11:21:34
看64-66页,这是一个最简单的CActiveScheduler的实现(我弄过一个复杂的版本)
咖啡屋主人 11:21:56
好的,谢谢了

咖啡屋主人 11:22:19
你是在广州还是深圳?

symbian交流 11:22:37
广州
咖啡屋主人 11:22:38
哦 ,

咖啡屋主人 11:22:49
我有几个同学在深圳工作

symbian交流 11:22:57
顺便看看
CEikonEnv的ExecuteD()的解释:
This function starts the active scheduler owned by the CCoeEnv, enabling the application to start receiving events from the window server. It forms the outer loop of all Control Environment applications.
咖啡屋主人 11:23:18


symbian交流 11:27:43
通过这句话以及一些文档我们知道,一个有界面程序,是
1 创建了app, doc, ui这三个类的实例
2 把它们设置进CEikonEnv
3 然后调用CEikonEnv的ExecuteD
而CEikonEnv的基类CCoeEnv创建了一个CActiveScheduler的实例CCoeScheduler。
在CEikonEnv的ExecuteD()里面它调用了CCoeScheduler的Start()函数,此时所有AO都在不断运行,直到有调用ui的Exit()时会间接调用活动规划器的Stop()函数,导致整个规划器停止
咖啡屋主人 11:28:44
哦,你真是强人啊 ,这些我还真没研究过

symbian交流 11:29:23
规划器的Start函数是怎么运行的呢?你就可以看看我发给你的pdf的64,65页,里面的Start函数及其调用的DoStart函数
咖啡屋主人 11:29:34


symbian交流 11:32:22
一个symbian有界面程序员(简称客户端吧),会在ui的ConstructL或者其它地方添加AO(通过CActiveScheduler::Add)。就算你没有添加任何AO,这套ui框架都有几个AO存在(你可以查查ContextPhone的源码看看怎么hack掉CCeoScheduler)
symbian交流 11:34:39
你的任何正规的异步函数调用,包括
直接的,比如RSocket::Send
和间接的,比如CMsvSession::OpenXXX
都不过是在某个AO的RunL下间接调用的

咖啡屋主人 11:35:08


symbian交流 11:35:59
也就是说,你的异步函数调用(书上叫发送异步消息什么的),其实是在pdf里面第65页的TRAPD(r, pR->RunL())里面间接调用的
symbian交流 11:37:37
你可以想像,如果你的函数不返回(比如不断的用User::After来sleep),这个RunL返回不了,导致活动规划器无法运行下一句,导致无法运行其它AO!!!
咖啡屋主人 11:38:23
看来我需要好好理解下了

咖啡屋主人 11:40:47
谢谢了

symbian交流 11:41:39
记不记得,有界面程序在执行某个地方的语句超过10秒的话,会报ViewSrv 11的错误?这就是RunL返回不了。window server会认为这个client没有反应(因为设计人员认为如果太长时间都不能让RunL返回的话这个程序也无法接收其它消息,认为死掉),就立即让client PANIC掉来退出。
symbian交流 11:44:58
pdf的这段代码第一次看懂的时候以为真的懂了,结果通过不断的深化认识才慢慢看的弄懂。我下面可能会继续说这个规划器,你可以不用理我的这些话,等你第一次看懂这段代码的时候再看不迟
咖啡屋主人 11:45:17


symbian交流 11:56:18
你看到pdf里面有level和iLevel这两个变量,是干什么的呢?是为了可以让客户端嵌套调用CActiveScheduler::Start(),当然要和Stop()配套
Stop的代码在66页,就是--iLevel。于是,当Stop次数等于Start时,就有iLevel==level,此时while(iLevel>level)这个循环便得以退出

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics