我有一个困扰我很久的问题。

精简版:

Windows Message Loop的工作范式是什么?

详细版本:

当启动Windows应用程序(不是控制台应用程序)时,我们可以通过鼠标或键盘与之交互。该应用程序从其消息队列中检索代表我们运动的各种消息。 Windows负责收集我们的操作并适本地将消息输入此队列。但是这种情况不是意味着Windows必须无限地运行吗?

我认为 Windows调度程序应该一直运行。它可能由时间中断以预定义的时间间隔调用。当调度程序被时间中断触发时,它将当前线程切换为下一个挂起的线程。单个线程只能在计划运行时使用GetMessage()来获取其消息。

我想知道是否只有一个Windows应用程序正在运行,此应用程序是否有更多机会获得其消息?

更新-1(2010年11月22日上午9:59)

这是我的最新发现:

根据第7章:线程优先级



我目前的理解是:

为了让系统知道何时将消息放入线程的队列中,我可以想到2种可能的方法:

1-集中化方法:负责始终检查 EVERY 线程队列的是系统。即使缺少该消息,该线程也会被阻塞。如果有任何消息可用,则系统会将该线程的状态更改为可调度。但是我认为这种检查可能是系统的实际负担

2-分布式方法:系统不会检查每个线程的队列。当线程调用GetMessage并发现没有可用消息时,系统将仅将线程的状态更改为阻塞,从而不再进行调度。将来,无论谁将消息放入阻塞线程的队列中,都是由“谁是”(不是系统)负责将线程的状态从阻塞更改为就绪(或任何状态) )。 因此,就GetMessage 而言,系统将该线程取消资格进行调度,而由其他人重新授予该线程资格。系统关心的只是调度可运行的线程。系统不在乎这些可调度线程的来源。此方法将避免方法1中的负担,从而避免可能的瓶颈。

实际上,关键是线程的状态如何改变?我不确定它是否真的是如附录2所示的分布式范例,但这是否是一个不错的选择?

最佳答案

应用程序在其消息循环中调用GetMessage()。如果消息队列为空,则该过程将仅阻塞直到另一条消息可用为止。因此,GetMessage是一种告诉Windows目前没有任何事情的进程方法。

09-10 07:31
查看更多