Results 1 to 5 of 5

Thread: How do you get CPU usage on NT ???

  1. #1

    Thread Starter
    Lively Member
    Join Date
    Sep 1999
    Location
    Liverpool, UK
    Posts
    64

    Angry

    Does anyone know how you go about getting the CPU usage on Windows NT ?

    I've found loads of examples that look it up in the registry in HKEY_DYN_DATA, but none of the examples work on NT because HKEY_DYN_DATA doesn't seem to exist....

  2. #2
    Fanatic Member crispin's Avatar
    Join Date
    Aug 2000
    Location
    2 clicks west of a Quirkafleeg...Cornwall, England
    Posts
    754
    The following code will enumerate all running processes on NT and give you the current memory usage, for continual monitoring you should start a SETTIMER (with the API) and in the callback timerproc you can use parts of this example to check the usage of all apps or just a particular application.

    Code:
    'FORM CODE - 1 COMMAND BUTTON, 1 LIST BOX
    Option Explicit
    
          Private Sub Command1_Click()
          List1.Clear
          Select Case getVersion()
    
          Case 1 'Windows 95/98
    
             Dim f As Long, sname As String
             Dim hSnap As Long, proc As PROCESSENTRY32
             hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
             If hSnap = hNull Then Exit Sub
             proc.dwSize = Len(proc)
             ' Iterate through the processes
             f = Process32First(hSnap, proc)
             Do While f
               sname = StrZToStr(proc.szExeFile)
               List1.AddItem sname
               f = Process32Next(hSnap, proc)
             Loop
    
          Case 2 'Windows NT
    
             Dim cb As Long
             Dim cbNeeded As Long
             Dim NumElements As Long
             Dim ProcessIDs() As Long
             Dim cbNeeded2 As Long
             Dim NumElements2 As Long
             Dim Modules(1 To 200) As Long
             Dim lRet As Long
             Dim ModuleName As String
             Dim nSize As Long
             Dim hProcess As Long
             Dim i As Long
             Dim GotMemInfo As Boolean
             Dim MemInfo As PROCESS_MEMORY_COUNTERS
             'Get the array containing the process id's for each process object
             cb = 8
             cbNeeded = 96
             Do While cb <= cbNeeded
                cb = cb * 2
                ReDim ProcessIDs(cb / 4) As Long
                lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
             Loop
             NumElements = cbNeeded / 4
    
             For i = 1 To NumElements
                'Get a handle to the Process
                hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
                   Or PROCESS_VM_READ, 0, ProcessIDs(i))
                'Got a Process handle
                If hProcess <> 0 Then
                    GotMemInfo = GetProcessMemoryInfo(hProcess, MemInfo, Len(MemInfo))
                    'Get an array of the module handles for the specified
                    'process
                    lRet = EnumProcessModules(hProcess, Modules(1), 200, _
                                                 cbNeeded2)
                    'If the Module Array is retrieved, Get the ModuleFileName
                    If lRet <> 0 Then
                       ModuleName = Space(MAX_PATH)
                       nSize = 500
                       lRet = GetModuleFileNameExA(hProcess, Modules(1), _
                                       ModuleName, nSize)
                       List1.AddItem Left(ModuleName, lRet) & " MEM USAGE " & MemInfo.PagefileUsage
                    End If
                End If
              'Close the handle to the process
             lRet = CloseHandle(hProcess)
             Next
    
          End Select
          End Sub
     
    
    
    
    
    
    
    'MODULE CODE
    Public Declare Function Process32First Lib "kernel32" ( _
             ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    
          Public Declare Function Process32Next Lib "kernel32" ( _
             ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    
          Public Declare Function CloseHandle Lib "Kernel32.dll" _
             (ByVal Handle As Long) As Long
    
          Public Declare Function OpenProcess Lib "Kernel32.dll" _
            (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, _
                ByVal dwProcId As Long) As Long
    
          Public Declare Function EnumProcesses Lib "psapi.dll" _
             (ByRef lpidProcess As Long, ByVal cb As Long, _
                ByRef cbNeeded As Long) As Long
    
          Public Declare Function GetModuleFileNameExA Lib "psapi.dll" _
             (ByVal hProcess As Long, ByVal hModule As Long, _
                ByVal ModuleName As String, ByVal nSize As Long) As Long
    
          Public Declare Function EnumProcessModules Lib "psapi.dll" _
             (ByVal hProcess As Long, ByRef lphModule As Long, _
                ByVal cb As Long, ByRef cbNeeded As Long) As Long
    
          Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _
             ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
    
          Public Declare Function GetVersionExA Lib "kernel32" _
             (lpVersionInformation As OSVERSIONINFO) As Integer
    
    
        Public Declare Function GetProcessMemoryInfo Lib "psapi.dll" _
            (ByVal Process As Long, ppsmemCounters As PROCESS_MEMORY_COUNTERS, ByVal cb As Long) As Boolean
        'Public Declare Function GetProcessMemoryInfo Lib "psapi.dll" _
        '(ByVal lHandle As Long, ByVal lpStructure As Long, ByVal lSize As Long) As Integer
    
          Public Type PROCESSENTRY32
             dwSize As Long
             cntUsage As Long
             th32ProcessID As Long           ' This process
             th32DefaultHeapID As Long
             th32ModuleID As Long            ' Associated exe
             cntThreads As Long
             th32ParentProcessID As Long     ' This process's parent process
             pcPriClassBase As Long          ' Base priority of process threads
             dwFlags As Long
             szExeFile As String * 260       ' MAX_PATH
          End Type
    
        Public Type PROCESS_MEMORY_COUNTERS
            cb As Long
            PageFaultCount As Long
            PeakWorkingSetSize As Long
            WorkingSetSize As Long
            QuotaPeakPagedPoolUsage As Long
            QuotaPagedPoolUsage As Long
            QuotaPeakNonPagedPoolUsage As Long
            QuotaNonPagedPoolUsage As Long
            PagefileUsage As Long
            PeakPagefileUsage As Long
        End Type
    
        Public Type OSVERSIONINFO
           dwOSVersionInfoSize As Long
           dwMajorVersion As Long
           dwMinorVersion As Long
           dwBuildNumber As Long
           dwPlatformId As Long           '1 = Windows 95.
                                          '2 = Windows NT
    
           szCSDVersion As String * 128
        End Type
    
          Public Const PROCESS_QUERY_INFORMATION = 1024
          Public Const PROCESS_VM_READ = 16
          Public Const MAX_PATH = 260
          Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
          Public Const SYNCHRONIZE = &H100000
          'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
          Public Const PROCESS_ALL_ACCESS = &H1F0FFF
          Public Const TH32CS_SNAPPROCESS = &H2&
          Public Const hNull = 0
    
          Function StrZToStr(s As String) As String
             StrZToStr = Left$(s, Len(s) - 1)
          End Function
    
          Public Function getVersion() As Long
             Dim osinfo As OSVERSIONINFO
             Dim retvalue As Integer
             osinfo.dwOSVersionInfoSize = 148
             osinfo.szCSDVersion = Space$(128)
             retvalue = GetVersionExA(osinfo)
             getVersion = osinfo.dwPlatformId
          End Function
    HOPE THIS HELPS

    Crispin
    VB6 ENT SP5
    VB.NET
    W2K ADV SVR SP3
    WWW.BLOCKSOFT.CO.UK

    [Microsoft Basic: 1976-2001, RIP]

  3. #3

    Thread Starter
    Lively Member
    Join Date
    Sep 1999
    Location
    Liverpool, UK
    Posts
    64
    Doesn't that just give me a list of running processes ?

    How do you determine the cpu usage from that ????

  4. #4
    Fanatic Member crispin's Avatar
    Join Date
    Aug 2000
    Location
    2 clicks west of a Quirkafleeg...Cornwall, England
    Posts
    754
    if you look at the code you will see that you can reference the PROCESS_MEMORY_COUNTERS structure as the code does to show the memory usage by process. you could find the total of these and put it out as the total memory usage figure maybe. Try it and see, if you just want the total CPU usage but not by process then I haven't written anything for that at the moment. If it doesn't do what you want joefoulkes then sorry, but thats the best help I can offer at the moment - maybe someone else has something better.

    Crispin
    VB6 ENT SP5
    VB.NET
    W2K ADV SVR SP3
    WWW.BLOCKSOFT.CO.UK

    [Microsoft Basic: 1976-2001, RIP]

  5. #5
    Fanatic Member crispin's Avatar
    Join Date
    Aug 2000
    Location
    2 clicks west of a Quirkafleeg...Cornwall, England
    Posts
    754
    GlobalMemoryStatus
    The GlobalMemoryStatus function obtains information about the computer system's current usage of both physical and virtual memory.

    VOID GlobalMemoryStatus(
    LPMEMORYSTATUS lpBuffer // pointer to the memory status structure
    );

    Parameters
    lpBuffer
    Pointer to a MEMORYSTATUS structure. The GlobalMemoryStatus function stores information about current memory availability into this structure.
    Return Values
    This function does not return a value.

    Remarks
    You can use the GlobalMemoryStatus function to determine how much memory your application can allocate without severely impacting other applications.

    The information returned by the GlobalMemoryStatus function is volatile. There is no guarantee that two sequential calls to this function will return the same information.

    QuickInfo
    Windows NT: Requires version 3.1 or later.
    Windows: Requires Windows 95 or later.
    Windows CE: Requires version 1.0 or later.
    Header: Declared in winbase.h.
    Import Library: Use kernel32.lib.

    MEMORYSTATUS
    The MEMORYSTATUS structure contains information about the current state of both physical and virtual memory. The GlobalMemoryStatus function stores information into a MEMORYSTATUS structure.

    typedef struct _MEMORYSTATUS { // mst
    DWORD dwLength; // sizeof(MEMORYSTATUS)
    DWORD dwMemoryLoad; // percent of memory in use
    DWORD dwTotalPhys; // bytes of physical memory
    DWORD dwAvailPhys; // free physical memory bytes
    DWORD dwTotalPageFile; // bytes of paging file
    DWORD dwAvailPageFile; // free bytes of paging file
    DWORD dwTotalVirtual; // user bytes of address space
    DWORD dwAvailVirtual; // free user bytes
    } MEMORYSTATUS, *LPMEMORYSTATUS;

    Members
    dwLength
    The size in bytes of the MEMORYSTATUS data structure. You do not need to set this member before calling the GlobalMemoryStatus function; the function sets it.
    dwMemoryLoad
    Specifies a number between 0 and 100 that gives a general idea of current memory utilization, in which 0 indicates no memory use and 100 indicates full memory use.
    dwTotalPhys
    Indicates the total number of bytes of physical memory.
    dwAvailPhys
    Indicates the number of bytes of physical memory available.
    dwTotalPageFile
    Indicates the total number of bytes that can be stored in the paging file. Note that this number does not represent the actual physical size of the paging file on disk.
    dwAvailPageFile
    Indicates the number of bytes available in the paging file.
    dwTotalVirtual
    Indicates the total number of bytes that can be described in the user mode portion of the virtual address space of the calling process.
    dwAvailVirtual
    Indicates the number of bytes of unreserved and uncommitted memory in the user mode portion of the virtual address space of the calling process.
    QuickInfo
    Windows NT: Requires version 3.1 or later.
    Windows: Requires Windows 95 or later.
    Windows CE: Requires version 1.0 or later.
    Header: Declared in winbase.h.





    Code:
    Private Type MEMORYSTATUS
        dwLength As Long
        dwMemoryLoad As Long
        dwTotalPhys As Long
        dwAvailPhys As Long
        dwTotalPageFile As Long
        dwAvailPageFile As Long
        dwTotalVirtual As Long
        dwAvailVirtual As Long
    End Type
    Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)
    Private Sub Form_Load()
        'KPD-Team 1998
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim MemStat As MEMORYSTATUS
        'retrieve the memory status
        GlobalMemoryStatus MemStat
        MsgBox "You have" + Str$(MemStat.dwTotalPhys / 1024) + " Kb total memory and" + Str$(MemStat.dwAvailPageFile / 1024) + " Kb available PageFile memory."
    End Sub
    Crispin
    VB6 ENT SP5
    VB.NET
    W2K ADV SVR SP3
    WWW.BLOCKSOFT.CO.UK

    [Microsoft Basic: 1976-2001, RIP]

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width