首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gui线程不应该生活在多线程的公寓里呢?

为什么gui线程不应该生活在多线程的公寓里呢?
EN

Stack Overflow用户
提问于 2014-09-06 17:05:55
回答 1查看 735关注 0票数 5

COINIT --用于指定窗口线程是在单个还是多线程单元中的枚举--文档(http://msdn.microsoft.com/en-gb/library/windows/desktop/ms678505(v=vs.85).aspx声明:

多线程单元用于非GUI线程.多线程单元中的线程不应执行UI操作。这是因为UI线程需要消息泵,而COM不为多线程单元中的线程提供消息。

为什么多线程单元中的线程不应该执行UI操作?在多线程单元中的线程中有一个消息循环有什么问题?COM是否为单个线程单元中的线程提供了自动消息循环?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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线程拥有的隐藏消息窗口,该窗口处理消息并实际进行调用。安全。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25702682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档