【发布时间】:2021-11-11 20:50:05
【问题描述】:
我正在尝试编写任务管理器的代码,但我坚持为每个进程 dy PID 使用 %CPU。 我写了类似的东西:
static float CalculateCPULoad(unsigned long long idleTicks, unsigned long long totalTicks)
{
static unsigned long long _previousTotalTicks = 0;
static unsigned long long _previousIdleTicks = 0;
unsigned long long totalTicksSinceLastTime = totalTicks - _previousTotalTicks;
unsigned long long idleTicksSinceLastTime = idleTicks - _previousIdleTicks;
float ret = 1.0f - ((totalTicksSinceLastTime > 0) ? ((float)idleTicksSinceLastTime) / totalTicksSinceLastTime : 0);
_previousTotalTicks = totalTicks;
_previousIdleTicks = idleTicks;
return ret;
}
static unsigned long long FileTimeToInt64(const FILETIME& ft) { return (((unsigned long long)(ft.dwHighDateTime)) << 32) | ((unsigned long long)ft.dwLowDateTime); }
并且像这样使用它:
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printError("Failed to create Process Snap");
return FALSE;
}
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hProcessSnap, &pe))
{
printError("Failed to move along process snap");
CloseHandle(hProcessSnap);
return FALSE;
}
do
{
printf("\n\n=====================================================");
_tprintf(TEXT("\n PROCESS NAME: %s"), pe.szExeFile);
printf("\n-----------------------------------------------------");
dwPriorityClass = 0;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
if (hProcess == NULL)
{
printError("Failed to open process");
}
else
{
for (int i = 0; i < 2; i++)
{
GetProcessTimes(hProcess, &exist, &exit, &lastKernel, &lastUser);
GetSystemTimes(&lastIdle, 0, 0);
GetCPULoad(lastIdle, lastKernel, lastUser);
Sleep(2500);
}
std::cout << GetCPULoad(lastIdle, lastKernel, lastUser) << "\n";
CloseHandle(hProcess);
}
} while (Process32Next(hProcessSnap, &pe));
CloseHandle(hProcessSnap);
return (TRUE);
}
我知道在这里使用 sleep() 不是一个好主意,但我暂时没有想到更好的办法。
如果可以的话,请帮我提供一些代码示例。
我也想知道我说的对吗:
进程的 CPU%= (1- (IdleSystemTimeDelta/TotalProcessTimeDelta))*100%
【问题讨论】:
-
我认为您需要描述当前代码存在的问题。它做错了什么?
-
@TedLyngmo:我认为每个正在运行的进程休眠 5 秒(并在 2.5 秒的时间间隔内测量 CPU 利用率,每个进程不同且不重叠)是很明显的问题。跨度>
-
@Danil 您需要做的第一件事是交换两个循环......您必须获取所有进程的“之前”CPU 时间,然后休眠一次,然后获取“之后”CPU 时间。下一个改进是在后续周期中,使用您从前一个周期中获得的“之后”CPU 时间作为新周期的“之前”时间。
-
@BenVoigt 是的,这听起来很糟糕,但这是 OP 询问的具体问题吗?我不知道。
标签: c++ winapi cpu-usage taskmanager