代码之家  ›  专栏  ›  技术社区  ›  Dustin Getz sunsations

在sta-com对象中阻塞

  •  2
  • Dustin Getz sunsations  · 技术社区  · 14 年前

    我要写一个有这个缺陷的控件。这到底是怎么回事?

    ActiveX控件具有 单线程公寓的缺陷 (STA)ActiveX&com对象必须 避免:STA COM对象无法执行 sta线程上的阻塞操作, 除非COM对象也泵 Windows消息。因此,如果您的 控件需要执行同步 阻塞操作,需要 执行Windows消息泵 正在等待阻塞操作 完成。

    Source

    我不想在阻塞时发送消息,因为这似乎会导致我的javascript以可重入的方式执行。这真的很糟糕。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Jim Brissom    14 年前

    您需要允许sta线程发送消息,因为否则,无法将调用调度到sta线程:因为公寓中已经有一个线程(并且它是单线程的,duh),没有其他线程可以进入公寓,因此向线程(隐藏)窗口发送消息是“打开”与STA线程通信的方式。

    这用于处理ORPC请求,也用于处理不一定与COM相关的消息(即GUI消息)。通过进行阻塞调用中断消息处理,从而中断ORPC功能,也可能阻塞用户界面。

    有关COM的详细信息,请参见Don Box“Essential COM”。

        2
  •  1
  •   wqw    14 年前

    你没有手动泵。尝试使用 CoWaitForMultipleHandles 而不是 MsgWaitForMultipleObjects 在论坛的片段中,让COM只发送线程间调用消息。