父子窗口分属不同消息循环在WinXP和WinCE的差异

18 篇文章 0 订阅

//=====================================================================
//TITLE:
//    父子窗口分属不同消息循环在WinXP和WinCE的差异
//AUTHOR:
//    norains
//DATE:
//    Monday 19- April-2010
//ENVIRONMENT:
//    WINDOWS CE 5.0
//    WINDOWS XP SP3
//=====================================================================

    老实说,这题目起的有点拗口,读起来不太滑溜;但更有意思的是,本文所说的情况比较特殊,并不一定大家都能碰上。不过,如果碰上了,估计找起来还特别费劲,特别是对于代码是从WinCE迁移到WinXP上的朋友而言。

 

    在开始进行本文的讨论之前,先确定如下特殊条件:

     1. 主线程创建父窗口。
     2. 创建一个线程,并在该线程中创建子窗口,且该线程有子窗口的消息循环。
     3. 进入到父窗口的消息循环。

 

    可能用文字描述有点抽象,我们来看看具体的代码:


    我承认,为了突出文章的主题,这代码写得有点峥嵘,实在不好理解。所以,就以流程图说一下流程:


 
    如果你是WinCE环境下,刚刚的那段代码跑的非常顺畅,一点问题都没有;但如果是在WinXP,那么一切都会改变,你会发现,程序没有响应,被卡死了。仔细追踪,你会发现出问题的是在流程图中的"创建子窗口"这一项,具体来说,是CreateWindowEx函数根本没有返回!

 

    解决方式也非常简单,在调用CreateWindowEx函数的时候,传入一个WinCE所不具备的WS_EX_NOPARENTNOTIFY即可。当你传入该数值时,CreateWindowEx就会如你所愿,顺顺当当返回。

 

    由此我们或多或少可以知道WinXP和WinCE在消息处理上的小小差异:如果没有WS_EX_NOPARENTNOTIFY,那么子窗口创建时,需要等待父窗口的回应。而在我们示例的代码中,父窗口还没有进入消息循环,无法正常响应子窗口的动作,于是便造成了死锁。而WinCE则没有这方面的问题,子窗口根本就不必等待父窗口的回应,相应的创建完毕后,直接返回。从这个意义上来说,我们一刀切地认为(可能实际底层代码并不一定如此),虽然WinCE不具备WS_EX_NOPARENTNOTIFY这个数值,但实际上却默认具备了该数值的属性。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值