与Windows等完全基于GUI的操作系统不同,Hello China在缺省情况下是基于字符shell的。用户通过gui命令,进入图形界面,这时候GUI Shell线程才会被创建。在图形模式下,用户可以按下Ctrl+Alt+Del组合键,退出GUI模式,返回到字符界面。这时候由于操作系统尚在运行,因此GUI模式的退出,必须像任何应用程序一样,完成扫尾工作。这包括释放相关资源,关闭需要GUI功能支撑的应用程序,等等。而如果是完全基于GUI Shell的操作系统,比如Windows等操作系统,在GUI Shell退出的时候,实际上操作系统已结束运行,这时候的退出操作就无需考虑资源的释放等工作。
在当前的实现方式中,用户一旦按下这个组合键,键盘驱动程序会截获该组合键,然后给操作系统核心发送一个TERMINAL消息。由于GUI模块在初始化时,会设定RAWIT线程为当前输入焦点线程,所以TERMINAL消息会首先被发送到RAWIT线程。这时候RAWIT线程会执行退出操作,下面是RAWIT线程处理TERMINAL消息的代码:
上述代码中的黑体部分,是处理TERMINAL消息的代码。RAWIT线程首先判断GUI Shell线程是否存在。一旦GUI线程被创建,该线程的句柄会被存储在GlobalParams.hGUIShell中。因此判断该句柄是否为NULL,即可确定GUI线程是否被创建。之所以做一个判断,是因为GUI模块在初始化的时候,是首先创建RAWIT线程的,然后再创建GUI Shell线程。这样有可能出现GUI Shell线程尚未被创建,用户就按下了Ctrl+Alt+Del组合键的情况。这样RAWIT线程就必须退出了,但这时候GUI Shell线程还未创建。因此在这里必须检查一下。如果GUI Shell被创建,则需给GUI Shell也发送一个结束消息,然后RAWIT线程也退出。
在GUI Shell收到TERMINAL消息后,也会做一些收尾工作,比如销毁创建的几个窗口对象,销毁应用程序profile列表,等等。然后即可结束运行。(www.xing528.com)
RAWIT和GUI Shell两个线程都结束运行之后,GUI线程会恢复执行。这时候GUI线程执行的就是GUI模块的退出清理操作。为了加深读者印象,再把GUI模块的__init函数相关代码摘录如下:
上述黑色字体部分代码,就是GUI线程在创建完RAWIT和GUI Shell线程之后,进入等待状态的两行代码。在RAWIT和GUI Shell两个线程不结束的情况下,GUI线程一直处于等待状态。而一旦这两个线程执行完毕,GUI线程会恢复执行。这时候黑体部分后面的代码将得到执行。这部分的代码,主要是销毁了RAWIT和GUI Shell这两个核心对象,释放了Video对象的相关资源(Video.Uninitialize函数),释放了Windows管理器的相关资源(WindowManager.Uninitialize函数),切换到字符模式,然后即可退出。
一旦GUI线程结束运行,字符模式的shell会被唤醒(字符shell会等待GUI Shell运行结束),然后重新进入字符shell。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。