在有限的RAM和有限的显示空间编程的要特殊考虑的事

Windows CE是彻底为小平台设计的一个新的Windows 版本 。尽管它只支持Win32 API的子集而牺牲了向后兼容性,但Windows CE通过将一个小版本的Windows扩展到英特尔x86系列以外的处理器而开拓了新领域。在这一卷中,我们将讨论一些技术优化Windows CE程序以减少它的内存占用。我们将讨论 命令栏,Windows CE的一个新的独特的结合了工具栏和菜单元素的控件。

Windows CE编程最重要的方面是需要管理一个程序可用的有限的内存。其它的Windows编程可以假定几乎无限的内存空间。即使一台PC机只有4MB 或8MB的RAM,Windows也可以用一个交换文件在硬盘上创建大量虚拟内存。但Windows CE设备只有2MB的RAM,且有一半用于文件存储。Windows CE应用程序必须尽可能减少所占用的内存空间以便在这样少的内存环境中生存。在设计程序时,你应该知道分配给Windows CE的不同类型的内存和如何最大限度地利用它们。

内存分配函数的核心集处理虚拟内存。尽管Windows CE不维护磁盘上的一个页面文件,它还是有一个支持基于页面的虚拟内存的内存保护方案。虚拟内存函数是分配有效内存给一个程序的最基本方法。当一个程序需要大块内存时应使用它们。Windows CE在内存少时限制单一虚拟内存的大小。超过64K的分配--或者有时甚至只有16K都会失败即使系统需要更多有效的内存空间。这样来防止任一程序占用所有有效的RAM。

当你需要虚拟内存,你要具体说明字节块的大小。然后,系统会在下一页面的开始部分分配。Windows CE支持几种处理器--通常的Hitachi SH3,NEC R4100,和 Phillips 3910--它们有不同的页面尺寸,Hitachi和NEC是1K而Phillips是4K。由于内存非常缺乏,这些不同可能很麻烦。例如,在一个基于 Phillips CPU的系统中,一个10字节的虚拟内存请求返回一块4K大小的区域,同样的请求在Hitachi系统中将返回1K。编程人员面临的挑战是变化应用程序使其在所有系统中运行良好。

堆是分配小的内存单元,即从一百到几千字节,最合适的地方。不同于Windows 3.x有64K的限制,Windows CE不限制堆的大小。当给定分配后操作系统扩展堆。当堆的内容释放,系统将尽可能的缩小堆的整个大小。但Windows CE不支持堆内可重定位的内存块。这意味着一定时间后堆可能变成碎片--更明白的说就是,一些小块被分配到许多页面,以致内存不能从系统释放。

解决碎片问题的一个方法是用HeapCreate分配一个单独的堆对象。然后你就可以在它内部分配和释放小块内存。尽管堆对象和堆本身一样同样有碎片问题,但当它的内存不再需要时,堆对象可以完全释放。由于堆对象需要一些经常的开销,应该避免在少于5K时创建堆。

不同于每天关闭或一个星期关一次的PC机。手持 PC机从来不真正关闭,它们只是在某处挂起。这意味着一个程序一次可以运行几个月。编程人员必须特别关注去了解让一个程序运行很长时间的问题。由于系统很少重新引导,内存漏失逐渐积聚并会严重影响性能。

当然,分配内存最简单的地方是在堆栈,它不会产生碎片。当数据压入堆栈。系统用虚拟内存分配自动增长堆栈。能够分配给任意函数的堆栈内存有限--只刚刚超过50K。但除了一些极端的情形,这并不是一个问题。

虚拟内存分配不仅在内存少的情况下失败,它们在系统企图增长堆栈时也会失败。当系统不能增长一个堆栈,它暂停属于堆栈的线程直到内存释放。当你设计一个运行在内存很少的环境下的程序时理解这一点十分重要。

当内存太少,系统将要求用户关闭一个程序。一个WM_CLOSE消息就会发送给用户选择终止的程序窗口。如果程序将大量数据压入堆栈并且系统不能增长堆栈,程序将挂起。如果程序在8秒内没有关闭,系统将强制终止它的线程并把它从内存清除,这可能导致大量数据丢失。

为避免这种情况,一个程序结束不应该在堆栈中压入大量数据。如果你有一个保存改变的对话框设置?对话框创建并隐藏,准备在程序需要关闭时出现,那么你将避免在程序终止时分配内存给对话框


posted on 2007-12-07 23:09  WindowsCE  阅读(373)  评论(0编辑  收藏  举报