5,693,062 members and growing! (17,476 online)
Email Password   helpLost your password?
Platforms, Frameworks & Libraries » Mobile Development » System     Intermediate License: The Code Project Open License (CPOL)

Full-Featured Task Manager for Windows Mobile

By Brian P. Adams

A full-featured Task Manager for Windows Mobile.
C# (C# 1.0, C# 2.0, C# 3.0, C#), .NET CF, Win32, Visual Studio (VS2008, Visual Studio), Dev

Posted: 17 Feb 2008
Updated: 17 Feb 2008
Views: 14,586
Bookmarked: 35 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
9 votes for this Article.
Popularity: 4.56 Rating: 4.78 out of 5
1 vote, 11.1%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
0 votes, 0.0%
4
8 votes, 88.9%
5

Introduction

There are many task managers for Windows Mobile out there, but I've never seen one that shows how much memory is being used by each process. I found this odd until I started digging into why. Microsoft hasn't provided the standard APIs for querying for a process' memory usage because memory works differently on WM. Fortunately, they did provide the Toolhelp32 APIs. This article implements a Task Manager for Windows Mobile that utilizes the Toolhelp32 library to take a snapshot of the heap and tally the memory usage for every process.

Background

The company I work for recently implemented a new mobile email solution. I found my phone/PPC's memory was frequently around 1MB even though the Task Manager that comes with WM didn't list any running processes. I decided to write a quick utility to walk active processes, and found the built-in task manager was only displaying processes which had a main window. I turned that utility into version 0.5 which displayed all processes, let me kill them, etc. I still hadn't answered my question about which process was chewing up my memory and if it was associated with the new email solution. I was frustrated by the lack of APIs for finding memory usage statistics. I needed to know how much memory the processes associated with my company's email solution was using, so I dug deeper. What I've published here is my final solution.

Using the Code

I won't spend much time describing how the application as a whole works, it's pretty standard. There is a file named Toolhelp32.cs which contains all the P/Invoke signatures needed to use the Toolhelp32 library. Below is the block of code that does the grunt work.

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 creates a snapshot of processes, threads, heaps, and modules of a process. I pass in the TH32CS_SNAPHEAPLIST, telling it I want information about the heap list. Once I have the snapshot, I walk the heaplists with the Heap32ListFirst and Heap32ListNext calls. For each list, I walk the heap with Heap32First and Heap32Next, and add up the block sizes for each entry in each list. Voila, the total allocated blocks for a process.

Points of Interest

There are lots of great articles out there on memory management for WM. I wish I had saved them so I could post the links here. All I can say is memory management on WM, while not nearly as robust as for a desktop OS, is much more complicated. Read-up before attempting anything more than Hello World for WM. And yes, the new email solution was the culprit.

History

  • Initial version posted 02/14/2008 8:50PM (EST).

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Brian P. Adams



Location: United States United States

Other popular Mobile Development articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 10 of 10 (Total in Forum: 10) (Refresh)FirstPrevNext
GeneralErrormemberPavanPareta1:07 22 Nov '08  
Generalregarding codememberMember 29629136:38 16 Jun '08  
GeneralRe: regarding codememberMarijn Stevens14:39 10 Jul '08  
GeneralBuilding the project with VS2005 and removing OpenNETCFmemberJeoff Hines3:55 15 May '08  
GeneralRe: Building the project with VS2005 and removing OpenNETCFmemberGary Dobbins5:54 6 Jun '08  
GeneralRe: Building the project with VS2005 and removing OpenNETCFmemberJeoff Hines4:13 9 Jun '08  
GeneralRe: Building the project with VS2005 and removing OpenNETCFmemberMember 29629137:54 18 Jun '08  
GeneralRe: Building the project with VS2005 and removing OpenNETCFmemberMember 29629138:22 19 Jun '08  
GeneralVS2005 versionmemberfbausch7:10 10 Mar '08  
GeneralNice onemembergore011:22 18 Feb '08  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 17 Feb 2008
Editor: Smitha Vijayan
Copyright 2008 by Brian P. Adams
Everything else Copyright © CodeProject, 1999-2008
Web13 | Advertise on the Code Project