首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程输入队列

线程输入队列
EN

Stack Overflow用户
提问于 2011-12-26 19:11:23
回答 2查看 2.5K关注 0票数 5

什么是“线程输入队列”?我在MSDN上见过几次,我可以不再怀疑它是否只是窗口的消息队列,它是由它们所指的线程创建的,还是其他什么的。

举个例子:

WH_MOUSE_LL钩子使您能够监视即将在线程输入队列中发布的鼠标输入事件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-26 20:03:22

首先,注意窗口没有单独的消息队列;窗口的消息存储在关联线程的消息队列中。

根据MSDN、键盘和鼠标输入消息被发送到与相关窗口相关联的线程的消息队列中。因此,我认为“线程输入队列”只是“线程消息队列”的另一种说法。

编辑:雷蒙德已经指出(请参阅注释),可以使用AttachThreadInput函数将输入重定向到不同线程的消息队列。因此,“线程输入队列”是指无论哪个消息队列接收到给定线程的输入;默认情况下,这是同一个线程的消息队列,但它可以是另一个线程的消息队列。

票数 2
EN

Stack Overflow用户

发布于 2017-11-29 08:22:30

真正的答案比逻辑抽象由MSDN提供稍微复杂一些。我可以更详细地回答,而不是在被接受的答案的评论中确认的内容。

是的,有两组信息。有一个"post消息队列“和一个”输入消息队列“。后者包含原始鼠标和键盘消息事件的列表。前者包含发布和合成的消息。

在内部,它们都只是列表,但是输入消息列表包含在内部引用为“输入队列”的更大结构中。该结构包含有关逻辑队列的数据,以及一个指针(原始输入消息列表)。

它们也可互换地分别称为“应用程序队列”和“系统队列”。

GetMessage()分别处理它们。

THREADINFO包含直接指向post消息列表/队列的指针。如果设置了QS_POSTMESSAGE,则扫描此选项。

如果设置了QS_INPUTQS_EVENT队列状态,则通过从THREADINFO获取初始队列结构指针来扫描输入列表/队列,然后从该队列结构获取指向输入列表的指针。奇怪,我知道。

如果设置了QS_TIMER队列状态标志,GetMessage() (或PeekMessage())实际上必须启动对完整的非内核计时器列表的扫描,以找到具有“属于”调用GetMessage()的状态的最早的定时器。队列实际上并不存储任何关于哪个计时器被触发的信息。它们仅存储的相关信息是QS_TIMER标志和触发的计时器数量计数(这样,一旦GetMessage()为上一次可用的触发定时器合成了消息,就知道何时清除QS_TIMER队列状态)。

其他合成消息的工作方式类似,因为它们基于存储在队列消息实际列表之外的数据,但仍然“在”队列结构本身的其他数据中。

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

https://stackoverflow.com/questions/8638456

复制
相关文章

相似问题

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