COINIT --用于指定窗口线程是在单个还是多线程单元中的枚举--文档(http://msdn.microsoft.com/en-gb/library/windows/desktop/ms678505(v=vs.85).aspx声明:
多线程单元用于非GUI线程.多线程单元中的线程不应执行UI操作。这是因为UI线程需要消息泵,而COM不为多线程单元中的线程提供消息。
为什么多线程单元中的线程不应该执行UI操作?在多线程单元中的线程中有一个消息循环有什么问题?COM是否为单个线程单元中的线程提供了自动消息循环?
发布于 2014-09-06 17:31:51
这有点向后,UI线程主要需要一个消息循环,这样它就可以接收来自Windows和其他进程的通知。消息循环是producer-consumer problem的通用解决方案。随着操作系统和其他进程的产生,UI线程消耗。
UI线程使用大量不安全的代码。这包括在COM中实现的主要特性,如drag+drop、剪贴板、shell对话框、浏览器等ActiveX控件。还有一堆从来没有线程安全的代码,因为程序员不需要这么做,编写起来就容易多了。这些特性需要一个STA线程,换句话说,是一个通过将COINIT_APARTMENTTHREADED传递给CoInitializeEx()来初始化COM的线程。
这是COM的一个承诺,即线程将是一个好公民,它不允许进行阻塞调用,并且必须泵出一个消息循环。它是COM用来封送从工作线程调用到STA线程的消息循环,以确保COM对象线程的安全。当所有调用都来自同一个线程时,就不会出现安全问题。底层调用是SendMessage(),有大量管道将函数参数从一个堆栈复制到另一个堆栈。CoInitializeEx()创建一个由STA线程拥有的隐藏消息窗口,该窗口处理消息并实际进行调用。安全。
https://stackoverflow.com/questions/25702682
复制相似问题