Windows Mobile 的全功能任务管理器





5.00/5 (10投票s)
适用于 Windows Mobile 的功能齐全的任务管理器。
引言
市面上有很多适用于 Windows Mobile 的任务管理器,但我从未见过一个能显示每个进程使用的内存量。我一直觉得很奇怪,直到我开始研究原因。微软没有提供标准的 API 来查询进程的内存使用情况,因为在 WM 上内存的工作方式不同。幸运的是,他们提供了 Toolhelp32 API。本文实现了一个适用于 Windows Mobile 的任务管理器,它利用 Toolhelp32 库来获取堆的快照,并统计每个进程的内存使用量。
背景
我所在的公司最近实施了一种新的移动电子邮件解决方案。我发现我的手机/PPC 的内存经常在 1MB 左右,即使 Windows Mobile 自带的任务管理器没有列出任何正在运行的进程。我决定编写一个快速的实用工具来遍历活动进程,并发现内置的任务管理器仅显示具有主窗口的进程。我将该实用工具发展成版本 0.5,它可以显示所有进程,让我杀死它们等等。但我仍然没有回答我的问题,即哪个进程正在占用我的内存,以及它是否与新的电子邮件解决方案有关。我因为缺乏查找内存使用统计信息的 API 而感到沮丧。我需要知道与我公司电子邮件解决方案相关的进程使用了多少内存,所以我深入研究了。我在这里发布的是我的最终解决方案。
Using the Code
我不会花太多时间描述应用程序的整体工作方式,它非常标准。有一个名为 Toolhelp32.cs 的文件,其中包含使用 Toolhelp32 库所需的所有 P/Invoke 签名。下面是执行繁重工作的代码块。
uint GetMemUsage(uint ProcId)
{
uint MemUsage = 0;
IntPtr hHeapSnapshot =
Toolhelp32.CreateToolhelp32Snapshot(Toolhelp32.TH32CS_SNAPHEAPLIST, ProcId);
if (hHeapSnapshot != INVALID_HANDLE_VALUE)
{
Toolhelp32.HEAPLIST32 HeapList = new Toolhelp32.HEAPLIST32();
HeapList.dwSize = (uint)Marshal.SizeOf(HeapList);
if (Toolhelp32.Heap32ListFirst(hHeapSnapshot, ref HeapList))
{
do
{
Toolhelp32.HEAPENTRY32 HeapEntry = new Toolhelp32.HEAPENTRY32();
HeapEntry.dwSize = (uint)Marshal.SizeOf(HeapEntry);
if (Toolhelp32.Heap32First(hHeapSnapshot, ref HeapEntry,
HeapList.th32ProcessID, HeapList.th32HeapID))
{
do
{
MemUsage += HeapEntry.dwBlockSize;
} while (Toolhelp32.Heap32Next(hHeapSnapshot, ref HeapEntry));
}
} while (Toolhelp32.Heap32ListNext(hHeapSnapshot, ref HeapList));
}
Toolhelp32.CloseToolhelp32Snapshot(hHeapSnapshot);
}
return MemUsage;
}
CreateToolhelp32Snapshot
创建进程、线程、堆和模块的快照。我传递 TH32CS_SNAPHEAPLIST
,告诉它我想要有关堆列表的信息。一旦我有了快照,我就使用 Heap32ListFirst
和 Heap32ListNext
调用遍历堆列表。对于每个列表,我使用 Heap32First
和 Heap32Next
遍历堆,并加总每个条目的块大小。完成了,一个进程的总分配块。
关注点
有很多关于 WM 内存管理的优秀文章。我希望我能保存它们,以便在这里发布链接。我只能说,WM 上的内存管理虽然不如桌面操作系统那么强大,但却更加复杂。在尝试超过 Hello World 的任何操作之前,请先阅读相关资料。是的,新的电子邮件解决方案就是罪魁祸首。
历史
- 初始版本发布于 2008 年 2 月 14 日下午 8:50(美国东部时间)。