我有一个分为几个部分的问题,希望您能帮助我解决。
我正在尝试编写一些代码来帮助我在一定时间间隔内获得硬盘性能。
基本上就像在Windows的“任务管理器”下使用性能,如下图所示:
但是实际读取/写入的字节数不是读取速度。
为了做到这一点,我遵循了一些指南,最后得到了以下代码:
HANDLE OpenTarget(PCWSTR lpName)
{
HANDLE hTarget;
hTarget = CreateFile(lpName,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
return hTarget;
}
long total_disk_read() noexcept {
HANDLE hTarget = OpenTarget(wszDrive);
if (hTarget == INVALID_HANDLE_VALUE)
{
LOG(error) << "Failed to get Disk info, code: " << GetLastError();
return 0 ;
}
DISK_PERFORMANCE dp = { 0 };
DWORD cbOutBufferSize = sizeof(DISK_PERFORMANCE);
DWORD cbBytesReturned = 0;
LPVOID lpOutBuffer = (LPVOID)&dp;
if (!DeviceIoControl(hTarget, IOCTL_DISK_PERFORMANCE, NULL, 0, lpOutBuffer, cbOutBufferSize, &cbBytesReturned, NULL))
{
LOG(error) << "Failed to get Disk Performance info, code: " << GetLastError();
CloseHandle(hTarget);
return 0 ;
}
else {
CloseHandle(hTarget);
return dp.BytesRead.QuadPart;
}
}
现在我有两个问题:
1-我知道dp.BytesRead返回在windows.h lib中定义的long_integer。
我用了很长时间来保留结果。是否有更好的格式可以使用。
2-我注意到每次返回读取增加时,这意味着读取计数器不会在每次读取时重置。它是否正确?以及如何解决呢?
提前致谢。
最佳答案
最安全的方法是让您的函数返回LARGE_INTEGER
或int64_t
(因为LARGE_INTEGER
是带符号的64位整数)。
保存前一次读取的值,并将返回值减少该值。
int64_t disk_read_since_last_check() noexcept {
static int64_t previous_read=0;
//...
int64_t rv = dp.BytesRead.QuadPart - previous_read;
previous_read = dp.BytesRead.QuadPart;
return rv;
}
关于c++ - 使用C++在Windows下获得Harddrrive性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53363291/