`
venus585625
  • 浏览: 248715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转载: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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics