我有一个分为几个部分的问题,希望您能帮助我解决。
我正在尝试编写一些代码来帮助我在一定时间间隔内获得硬盘性能。

基本上就像在Windows的“任务管理器”下使用性能,如下图所示:
c++ - 使用C++在Windows下获得Harddrrive性能-LMLPHP

但是实际读取/写入的字节数不是读取速度。

为了做到这一点,我遵循了一些指南,最后得到了以下代码:

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_INTEGERint64_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/

10-12 00:18