Re: [cpp] 有关 STA 的疑问

sunpluto sunpluto2004 at yahoo.com.cn
Mon Mar 19 15:34:46 CST 2007


谢谢 qiaojie
   
  其实我是想找到一种优雅的方式来处理这个问题
   
  而且我的接口调用虽然是在主界面线程中,但调用过程实际是在一个动态库中完成的,因此使用环境变量的方法不够优雅。
   
  其实,使用 MTA 的方式虽然没有这种问题,但是 IEnumIDList 的枚举操作的结果与 STA 方式的结果有一些不一样。
   
  看来实在不形的话,我只能用 MTA 方式来初始化 COM 了

qiaojie <qiaojie at gmail.com> 写道:
    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疯狂搜-新歌热歌高速下   

_______________________________________________
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附件!   

_______________________________________________
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附件
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://codingnow.com/pipermail/cpp/attachments/20070319/39db00ff/attachment.html


More information about the Cpp mailing list