06
2025
05
15:02:46

20年前的bug解密,终于真相大白了!


2009年微软发布了Windows7,距离今天将近20年了。近期,Raymond Chen(一位资深的微软工程师)在博客中发表了一段文字,列举了一个很有意思的案例。很多老用户可能也遇到过类似的问题:在打开电脑后,进入欢迎屏幕时,可能需要等待很长的时间,有时长达30秒才能进行登录。出现这个问题,与一个特定的的设置有关,涉及到「背景图片」,你没有看错,和你的壁纸有关图片微软社区也证实过确实存在该问题
图片
到底是什么原因导致出现的这个问题呢?根据Raymond Chen的描述:他从 Windows 95开始就使用纯色背景来节省内存,但更容易报告错误,据他介绍,Windows登录过程涉及同时加载多个组件,例如任务栏、系统服务、桌面图标和背景。系统等待它们都发出准备就绪的信号或30秒后,欢迎屏幕才会淡出并显示桌面。
延迟30秒的原因就是,其中一个组件迟迟不能发送“准备就绪”的信号。他用了一个简化的代码来介绍Windows7是如何加载壁纸的
InitializeWallpaper(){    if (wallpaper bitmap defined)    {        LoadWallpaperBitmap();    }}LoadWallpaperBitmap(){    locate the bitmap on disk    load it into memory    paint it on screen    Report(WallpaperReady);}
稍微有一些程序基础的应该可以比较清楚的看懂上面的代码,仅仅在定义了wallpaper bitmap(壁纸位图)的情况下,才会执行LoadWallpaperBitmap函数,而这个函数中存在一行非常重要的代码:Report(WallpaperReady)。这行代码就是报告“壁纸准备就绪”。但是,当你使用了纯色壁纸时,上面的代码会自动跳过LoadWallpaperBitmap函数,也就是说,系统一直等不到“壁纸准备就绪”的信号,直到等了30秒超时,才会继续显示桌面。
除了使用纯色背景会出现上述问题外,如果启用了“隐藏桌面图标”组策略,依然可能出现类似问题。原理差不多,“桌面图标准备就绪”的代码被放到了该策略的条件检查中。
// Original codeInitializeDesktopIcons(){    bind to the desktop folder    enumerate the icons    add them to the screen    Report(DesktopIconsReady);}// Updated with group policy supportInitializeDesktopIcons(){    if (desktop icons allowed by policy)    {        bind to the desktop folder        enumerate the icons        add them to the screen        Report(DesktopIconsReady);    }}
Raymond Chen强调,登录过程本身不一定需要额外的30秒才能完成所有任务,就是因为一个特定组件无法报告其完成情况,即使登录的所有其他部分都已提前完成加载,也要继续等。当然,这只是开发过程中的一个小插曲,微软早就已经通过系统更新解决掉了。屎山代码就是这么来的,我们了解一下这个花絮而已~
图片有网友一阵见血地评论到:主要原因是微软的厨师太多,它需要一个厨师长。





推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/11049.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: