Ejemplo n.º 1
0
    double ProcessMetrics::GetCPUUsage()
    {
        FILETIME now;
        FILETIME creation_time;
        FILETIME exit_time;
        FILETIME kernel_time;
        FILETIME user_time;

        GetSystemTimeAsFileTime(&now);

        if(!GetProcessTimes(process_, &creation_time, &exit_time,
            &kernel_time, &user_time))
        {
            // We don't assert here because in some cases (such as in the Task Manager)
            // we may call this function on a process that has just exited but we have
            // not yet received the notification.
            return 0;
        }
        int64 system_time = (FileTimeToUTC(kernel_time) + FileTimeToUTC(user_time)) /
            processor_count_;
        int64 time = FileTimeToUTC(now);

        if((last_system_time_ == 0) || (last_time_ == 0))
        {
            // First call, just set the last values.
            last_system_time_ = system_time;
            last_time_ = time;
            return 0;
        }

        int64 system_time_delta = system_time - last_system_time_;
        int64 time_delta = time - last_time_;
        DCHECK(time_delta != 0);
        if(time_delta == 0)
        {
            return 0;
        }

        // We add time_delta / 2 so the result is rounded.
        int cpu = static_cast<int>((system_time_delta * 100 + time_delta / 2) /
            time_delta);

        last_system_time_ = system_time;
        last_time_ = time;

        return cpu;
    }
Ejemplo n.º 2
0
	double ProcessMetrics::GetCPUUsage() {
		FILETIME creation_time;
		FILETIME exit_time;
		FILETIME kernel_time;
		FILETIME user_time;

		if (!GetProcessTimes(process_, &creation_time, &exit_time,
			&kernel_time, &user_time)) {
			// We don't assert here because in some cases (such as in the Task Manager)
			// we may call this function on a process that has just exited but we have
			// not yet received the notification.
			return 0;
		}
		int64 system_time = (FileTimeToUTC(kernel_time) + FileTimeToUTC(user_time)) /
			processor_count_;
		TimeTicks time = TimeTicks::Now();

		if (last_system_time_ == 0) {
			// First call, just set the last values.
			last_system_time_ = system_time;
			last_cpu_time_ = time;
			return 0;
		}

		int64 system_time_delta = system_time - last_system_time_;
		// FILETIME is in 100-nanosecond units, so this needs microseconds times 10.
		int64 time_delta = (time - last_cpu_time_).InMicroseconds() * 10;
		DCHECK_NE(0U, time_delta);
		if (time_delta == 0)
			return 0;

		// We add time_delta / 2 so the result is rounded.
		int cpu = static_cast<int>((system_time_delta * 100 + time_delta / 2) /
			time_delta);

		last_system_time_ = system_time;
		last_cpu_time_ = time;

		return cpu;
	}