【WM】Phone Canvas重复创建视图的原因

本文分析了在H.324协议栈线程内调用PhoneCanvas函数导致cprog.exe创建多个ProgressView的问题。解释了由于线程上下文不同而造成的视图混乱现象,并给出了确保视图在同一线程中创建的解决方案。

记得08年刚做可视电话模块的时候,我们被Phone Canvas函数不返回RPC_E_WRONG_THREAD现象所迷惑,在H.324协议栈线程内调用了Phone Canvas函数导致cprog.exe创建了两个Progress View。结果两个Progress View交替显示,状态那叫一个混乱哟!

解决这个问题的方法,笔者已在《【WM】谈Phone Canvas函数为何不会返回错误值RPC_E_WRONG_THREAD》一文中给出,即:Phone Canvas函数需要在cprog.exe的UI线程上下文中调用,至于造成这个问题的原因将在本文中分析。

Phone Canvas的Dialer、Progress和SmartDialer视图都派生自同一个基类CProgressCommon,这个基类下面有个EnsureViewExists()方法:

在EnsureViewExists()方法内对视图的线程上下文进行了验证,如果视图不在当前线程上下文创建的,则重新创建视图。

因此,上述故障就很容易理解了:cprog.exe启动时UI线程创建了一个Progress视图,然后我们在H.324协议栈线程上下文间接调用了EnsureViewExists()方法又创建了一个Progress视图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值