Re: [cpp] 有关 STA 的疑问
qiaojie
qiaojie at gmail.com
Sun Mar 18 21:29:11 CST 2007
COM在进行跨套间调用的时候会在消息队列上等待操作完成,所以你说的这种情况是可能发生的。有两个简单的解决方法:
1、在OnDestroy里面直接调用exit(0);这样立刻就能退出程序,虽然比较暴力,但是是最简单的解决方案。
2、用个外部变量检查消息队列处理函数是否被重入:
inNext = true;
obj->Next();
inNext = false;
在OnDestroy里检查inNext,如果为true则直接返回而不进行窗口的关闭。这样用户就不能在Next调用过程中关闭窗口了。
On 3/18/07, sunpluto <sunpluto2004 at yahoo.com.cn> wrote:
>
> 我是在主界面线程中调用 shell 的 IEnumIDList 接口的 Next 操作,在 Next 调用时,Next
> 函数会阻塞,而我的主界面线程是用 OleInitialize 初始化的,因此主界面线程中创建了一个 主STA。
> 在 Next 函数阻塞的过程中,程序好像隐含了一个消息循环处理,因此即使在阻塞的过程中,程序仍然能够响应消息,从而能够将主界面窗口关闭。
> 但在主界面窗口被关闭后,Next 调用就悬挂起来了,永远不能返回(仿佛调用进入了一个死循环),导致整个程序无法正常退出。
> 我尝试了一下自定义 IMessageFilter 接口,但还是无法解决这个问题。
>
> 不知道以上的解释是否够清楚了,还请各位大虾指点一下。
>
> *qiaojie <qiaojie at gmail.com>* 写道:
>
> 语焉不详,无从回答。
> COM对象在哪个线程创建的?在哪个线程被调用的?哪个线程阻塞了?
>
>
> On 3/15/07, sunpluto <sunpluto2004 at yahoo.com.cn> wrote:
> >
> > 各位大虾:
> >
> > 最近我写了个测试程序,用到 IEnumIDList 的 Next 操作枚举目录中的元素,但 IEnumIDList 是一个 COM
> > 接口,而在我的主程序工作于 COM 的 STA 模式时,Next 操作的过程会阻塞,在阻塞的过程中会进行窗口消息的派发(STA
> > 模式有内含一个隐藏的消息处理循环),若此时我关闭了主窗口,则窗口是不见了,但整个程序便挂起了(在隐含的消息处理循环中派发了 WM_DESTROY
> > 消息,但是却无法从 Next 函数的访问中返回,程序就这样挂起了)。
> >
> > 我查到使用自定义的 IMessageFilter 可能可以解决这个问题,但我实现后却发现问题照旧。
> >
> > 我在网上找了很久,都没找到答案,讨论组中的大虾们,能解答一下么???
> >
> > 先谢拉。
> >
> >
> > 致
> > 礼
> > ------------------------------
> > Mp3疯狂搜-新歌热歌高速下 <http://music.yahoo.com.cn/?source=mail_mailbox_footer>
> >
> > _______________________________________________
> > Cpp mailing list
> > Cpp at codingnow.com
> > http://codingnow.com/mailman/listinfo/cpp
> >
> >
> _______________________________________________
> Cpp mailing list
> Cpp at codingnow.com
> http://codingnow.com/mailman/listinfo/cpp
>
>
>
>
> 致
> 礼
>
> ------------------------------
> 抢注雅虎免费邮箱-3.5G容量,20M附件! <http://cn.mail.yahoo.com/>
>
>
> _______________________________________________
> Cpp mailing list
> Cpp at codingnow.com
> http://codingnow.com/mailman/listinfo/cpp
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://codingnow.com/pipermail/cpp/attachments/20070318/edf78618/attachment.html
More information about the Cpp
mailing list