MicroBlue 发表于 2012-2-23 13:09:23

tasklist 中获取某进程的内存占用为什么和任务管理器中的不一样?

大家好:

    我想使用autoit监控单一进程的内存使用率,但是一直没有找到好的解决方法。于是想到了用tasklist这种方式,但是发现 tasklist返回的内存使用率和任务管理器中的不一致? 在网上也找不到答案,请大侠帮我解惑,不甚感激!!

MicroBlue 发表于 2012-2-23 13:13:21





这是一个notepad.exe例子,我也没有找到换算关系..



请大家帮忙看看

MicroBlue 发表于 2012-2-25 23:34:32

怎么 没人 回答?

哎。。。。。。。。。。

afan 发表于 2012-2-25 23:40:32

我这测试是一样的

asionwu 发表于 2012-2-26 09:47:30

好像是内存占用和虚拟内存占用的总和

MicroBlue 发表于 2012-2-27 09:00:57

回复 3# MicroBlue


   Still Thanks 阿凡........

MicroBlue 发表于 2012-2-27 09:03:00

回复 4# afan


    afan, 我想监控一个程序的 内存使用率,想用 API 去做,但是对API 不熟悉。 afan 给个链接,或给个明路呗...........我已经搜索过论坛了,没有找到好的方法啊。

MicroBlue 发表于 2012-2-27 09:04:15

回复 4# afan


thanks, 为何还有虚拟内存啊?

afan 发表于 2012-2-27 10:07:39

回复afan


    afan, 我想监控一个程序的 内存使用率,想用 API 去做,但是对API 不熟悉。 afan 给个 ...
MicroBlue 发表于 2012-2-27 09:03 http://www.autoitx.com/images/common/back.gif#include <WinAPIEx.au3>
#include <Array.au3>

Local $aPidL = ProcessList()
If @error Then Exit
For $i = 1 To $aPidL
        $aPidL[$i] = _GetProcessMemory($aPidL[$i])
Next
_ArrayDisplay($aPidL, '进程内存占用')

Func _GetProcessMemory($iPid, $NFormat = 1)
        ;afan提示:默认返回以千位逗号分割的内存占用KB值;$NFormat 参数为0则返回字节数
        Local $Data = _WinAPI_GetProcessMemoryInfo($iPid)
        If Not IsArray($Data) Then Return SetError(1, '', '')
        If Not $NFormat Then Return $Data
        Return StringRegExpReplace($Data / 1024, '(\d+?)(?=(?:\d{3})+\Z)', '$1,') & ' (K)'
EndFunc   ;==>_GetProcessMemory

MicroBlue 发表于 2012-2-27 10:44:48

回复 9# afan


    Thanksa lot .

jasmine 发表于 2013-4-11 15:28:13


afan 发表于 2012-2-27 10:07 http://www.autoitx.com/images/common/back.gif


    大大啊~~为毛 我这边

_GetProcessMemory 是Return SetError(1, '', '')

求帮助啊!

afan 发表于 2013-4-11 15:32:11

回复 11# jasmine


    查看 _WinAPI_GetProcessMemoryInfo() 找原因; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_GetProcessMemoryInfo
; Description....: Retrieves information about the memory usage of the specified process.
; Syntax.........: _WinAPI_GetProcessMemoryInfo ( [$PID] )
; Parameters.....: $PID    - The PID of the process. Default (0) is the current process.
; Return values..: Success - The array that contains the following information.
;
;                            - The number of page faults.
;                            - The peak working set size, in bytes.
;                            - The current working set size, in bytes.
;                            - The peak paged pool usage, in bytes.
;                            - The current paged pool usage, in bytes.
;                            - The peak nonpaged pool usage, in bytes.
;                            - The current nonpaged pool usage, in bytes.
;                            - The current space allocated for the pagefile, in bytes.
;                            - The peak space allocated for the pagefile, in bytes.
;                            - The current amount of memory that cannot be shared with other processes, in bytes.
;
;                  Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ GetProcessMemoryInfo
; Example........: Yes
; ===============================================================================================================================

Func _WinAPI_GetProcessMemoryInfo($PID = 0)

        If Not $PID Then
                $PID = _WinAPI_GetCurrentProcessID()
                If Not $PID Then
                        Return SetError(1, 0, 0)
                EndIf
        EndIf

        Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', 0x00000410, 'int', 0, 'dword', $PID)

        If (@error) Or (Not $hProcess) Then
                Return SetError(1, 0, 0)
        EndIf

        Local $tPMC_EX = DllStructCreate('dword;dword;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr;ulong_ptr')
        Local $Ret = DllCall(@SystemDir & '\psapi.dll', 'int', 'GetProcessMemoryInfo', 'ptr', $hProcess, 'ptr', DllStructGetPtr($tPMC_EX), 'int', DllStructGetSize($tPMC_EX))

        If (@error) Or (Not $Ret) Then
                $Ret = 0
        EndIf
        _WinAPI_CloseHandle($hProcess)
        If Not IsArray($Ret) Then
                Return SetError(1, 0, 0)
        EndIf

        Local $Result

        For $i = 0 To 9
                $Result[$i] = DllStructGetData($tPMC_EX, $i + 2)
        Next
        Return $Result
EndFunc   ;==>_WinAPI_GetProcessMemoryInfo

jasmine 发表于 2013-4-11 16:12:31

本帖最后由 jasmine 于 2013-4-11 16:26 编辑

回复 12# afan
Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', 0x00000410, 'int', 0, 'dword', $PID)

      If (@error) Or (Not $hProcess) Then
                Return SetError(1, 0, 0)
      EndIf
这里 @error 为0
$hProcess 为0

jasmine 发表于 2013-4-11 16:17:23

求大大 帮助{:face (319):}

pighk 发表于 2013-11-25 12:59:43

受教了。不错记号。一下。
页: [1] 2
查看完整版本: tasklist 中获取某进程的内存占用为什么和任务管理器中的不一样?