转载:Windows的消息循环 与 Symbian的活动对象调度器

假设:

我们要写一个程序。这个程序运行时,是只有一个线程的进程。它的入口点函数为main()。

那么:

当main()中的代码运行完时,程序就结束运行了。如何确保在用户选择退出前,程序一直运行? Windows中通过"消息循环"达到这种目的,而Symbian则使用"活动对象调度器"。

Windows中,GetMessage()会从线程的消息队列中不断取消息,直到取得WM_QUIT消息时,消息循环结束,程序就可以正常退出了。

而在Symbian中,程序框架中没有使用"消息循环机制",而是使用"活动对象机制"。活动对象调度器CActiveScheduler的Start()相当与开始消息循环,CActiveScheduler的Stop()相当与停止消息循环。CActiveScheduler::Start()不是随随便便就可以调用的,调用它前必须确保:至少有一个活动对象(CActive)加入到了该活动对象调度器(CActiveScheduler)中,并发布了异步请求。这样,在异步请求完成后,活动对象的RunL()就会被调用,在这个RunL()中又可以发布新的异步请求,实现程序的不断运行,直到CActiveScheduler::Stop()被调用。

当执行到CActiveScheduler::Start()时,其后的代码不会被立即执行,看起来就像CActiveScheduler::Start()是一个阻塞调用。那么要阻塞到什么时候?阻塞直至CActiveScheduler::Stop()被调用,并且调用CActiveScheduler::Stop()的RunL()中的代码跑完。CActiveScheduler::Start()执行完毕返回的时候,也就是程序该结束的时候了(非多线程时)。

"消息循环"和"活动对象"这两种机制都实现了所谓的"纤程(把一个线程分成多段)"。"消息循环"中对每个消息的处理过程可以视为一个"纤程",而"活动对象"中的每个RunL()也可视为"纤程"。两者都实现了:上一个处理过程(函数)退栈以后,再开始下一个处理过程(函数)的调用。

若要在Symbian中使用消息机制,可以通过将定时器或RMsgQueue等封装成活动对象来实现,除非谁愿意写个不断轮询的循环。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/anjgao/archive/2009/05/04/4145135.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值