很多 Windows 信息通知机制是基于广播消息,例如,DDE,WM_FONTCHANGE 消息和系统设置的修改等。
当我们知道,消息的广播可能导致系统由于某个窗口停止处理消息而导致整个系统停止时,为什么我们还是使用广播呢?
因为在16位 Windows 中,你没有这个问题。
回想一下,16位 Windows 是协作式多任务处理的。当一个程序获得对 CPU 的控制权时,它可以做任何它想做的事情,因为它知道,在它通过调用 GetMessage 或PeekMessage 等函数明确产生控制权之前,没有其他程序可以运行。
当然,这样做的缺点是,单个挂起的程序导致整个系统挂起,因为它没有释放CPU。
然而,好处是,如果你的程序正在运行,那么你预先就可以知道系统中没有挂起的程序。你怎么知道?因为如果有一个挂起的程序,它将一直运行,你的程序根本没有机会运行。
如果只有一把锁,而你拥有它,那么你就知道没有其他人在霸占它。因此,在 16 位 Windows 中使用广播消息是完全安全的。你不必担心无响应的程序,因为你有证据证明没有任何程序。
当然,当切换到抢占性多任务系统时,这个假设不再适用,但那时为时已晚。
基于广播的模型已经在使用中,因此出于兼容性原因必须保留。(例如,如果 Lotus 1-2-3 停止在 Windows NT 上工作,因为不再支持 DDE 广播,那就太糟糕了。如果Windows NT 团队尝试过这种策略,就没有人会愿意升级,Windows NT 也不会幸存下来制作它的第二个版本。)
另一方面,考虑到 DDE 广播所涉及的风险,最好将程序设计为不使用动态数据交换作为数据通信机制,从而避免消息广播的陷阱。所以,开发者还是不要在这个议题上自寻烦恼了。
总结
又一个为了兼容性不得不背负的包袱。
为什么兼容性如此重要?
> 你的用户可能没有更新系统,或者他正在使用非常老的系统。
> 你的用户使用了最新的操作系统,但是还是使用很老的应用程序。
> 你的用户使用了最新的操作系统,但他使用的设备还是非常老的。
不能因为更新了一次系统版本,就导致了某个功能不可用。
这就是原因。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why are there broadcast-based mechanisms in Windows?》