Search code examples
c++cpu-usagesigar

How to correctly get a per process percent of used CPU using the SIGAR libraries


I'm writing a code to get a per process percent of used CPU, but something is wrong with my code. That displays strange values like 3.63499e+262 % and 0%, while the task manager displays a value bigger than 0% and lower or equal a 100%. What i'm doing wrong?

sigar_t *sigarproclist;
sigar_proc_list_t proclist;
sigar_open(&sigarproclist);
sigar_proc_list_get(sigarproclist, &proclist);
for (size_t i = 0; i < proclist.number; i++)
{
    sigar_proc_cpu_t cpu;
    sigar_proc_cpu_get(sigarproclist, proclist.data[i], &cpu);
    sigar_proc_state_t procstate;
    sigar_proc_state_get(sigarproclist, proclist.data[i], &procstate);
    qDebug() << procstate.name << 100 * cpu.percent << "%";
}
sigar_close(sigarproclist);

Solution

  • I made some changes in my code, and now it looks valid.

    sigar_t *sigarcpulist;
    sigar_cpu_info_list_t cpulist;
    sigar_open(&sigarcpulist);
    sigar_cpu_info_list_get(sigarcpulist, &cpulist);
    sigar_close(sigarcpulist);
    
    forever
    {
        float percent;
        sigar_t *sigarproclist;
        sigar_proc_list_t proclist;
        sigar_open(&sigarproclist);
        sigar_proc_list_get(sigarproclist, &proclist);
        for (size_t i = 0; i < proclist.number; i++)
        {
            sigar_proc_cpu_t cpu;
            sigar_proc_cpu_get(sigarproclist, proclist.data[i], &cpu);
        }
        Sleep(1000);
        for (size_t i = 0; i < proclist.number; i++)
        {
            sigar_proc_cpu_t cpu;
            int status = sigar_proc_cpu_get(sigarproclist, proclist.data[i], &cpu);
            if (status == SIGAR_OK)
            {
                sigar_proc_state_t procstate;
                sigar_proc_state_get(sigarproclist, proclist.data[i], &procstate);
                percent = cpu.percent * 100 / cpulist.size;
                qDebug() << procstate.name << percent << "%";
            }
        }
        sigar_close(sigarproclist);
    }