I am trying to query the process statistics against the runtime in Windows 
so I can monitor it's utilisation.

First, I get the process handle for the runtime:

// GetCurrentProcess will return our process handle with the appropriate 
information.
func GetCurrentProcess() (syscall.Handle, error) {
    myProcess, err := syscall.GetCurrentProcess()
    if err != nil {
        return syscall.Handle(0), err
    }
    return syscall.Handle(myHandle), err
}



Then, I sleep for one second to make sure the process has been running for 
at least one second, so no counters will be 0. After that, I call 
`syscall.GetProcessTimes()`:

func (p *ProcInfo) GetProcessTimes() error {
    lpCreationTime := new(syscall.Filetime)
    lpExitTime := new(syscall.Filetime)
    lpKernelTime := new(syscall.Filetime)
    lpUserTime := new(syscall.Filetime)

    if err := syscall.GetProcessTimes(p.handle, lpCreationTime, lpExitTime, 
lpKernelTime, lpUserTime); err != nil {
        return err
    }

    p.CreationTime = lpCreationTime
    p.ExitTime = lpExitTime
    p.KernelTime = lpKernelTime
    p.UserTime = lpUserTime

    return nil
}



Once that is done, I print out the values:

func main() {
    me, err := GetCurrentProcess()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    proc := &ProcInfo{handle: me}

    time.Sleep(time.Duration(time.Second * 1))

    err = proc.GetProcessTimes()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Printf("%#v\n", proc)
    fmt.Printf("kernel low time: %d\n", proc.KernelTime.LowDateTime)
    fmt.Printf("kernel high time: %d\n", proc.KernelTime.HighDateTime)
    fmt.Printf("user low time: %d\n", proc.UserTime.LowDateTime)
    fmt.Printf("user high time: %d\n", proc.UserTime.HighDateTime)
}



I've been reading through the Windows API documentation 
<https://msdn.microsoft.com/en-us/library/windows/desktop/ms683223(v=vs.85).aspx>
 
and it should return the value in 100-nanosecond units the process has 
spent in user and/or kernel space. However, even thought I'm sleeping my 
little test program for 1 second, all the counters from 
`syscall.GetProcessTimes()` are 0. They should at least be in the millions 
since the program slept for 1 second.

Here is the full code: https://play.golang.org/p/_Z3o4H2WwR

Is this a bug or am I not using it correctly?

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to