2

在驱动器 G 上进行了几项操作。我的程序应该从文件中读取数据。当磁盘使用率非常高(> 90%)时,程序应该减慢读取速度,以免干扰使用磁盘的其他进程。
显然,我猜,检查Disk Timeafter 调用get_data_from_file()会导致计数器返回非常高的百分比,因为磁盘刚刚被使用。你可以在图片上看到。

关于如何正确检查的任何建议Disk Time

PDH_HQUERY query;
PDH_HCOUNTER counter;
PdhOpenQuery(NULL, 0, &query);
PdhAddCounterA(query, "\\LogicalDisk(G:)\\% Disk Time", 0, &counter);
PdhCollectQueryData(query);

auto getDiskTime = [&]()->double
{
    PDH_FMT_COUNTERVALUE fmtCounter;
    PdhCollectQueryData(query); 
    PdhGetFormattedCounterValue(counter, PDH_FMT_DOUBLE, 0, &fmtCounter);       

    return fmtCounter.doubleValue;
};

for(...)
{
   get_data_from_file();

   print_done_percentage();

   double diskUsage = getDiskTime();
   if(diskUsage >= 90)
   {            
       std::cout << "The disk usage is over << diskUsage << "%. I'll wait...                
       while(diskUsage >= 90)
       {
           diskUsage = getDiskTime();
           Sleep(500);
       }
   }
}
4

1 回答 1

1

一个独特的监控线程可以帮助您测量磁盘使用情况,并且更加独立于写入。

线程执行的函数如下所示:

void diskmonitor(atomic<double>& du, const atomic<bool>& finished) {
    while (!finished) {         // stop looping as soon as main process has finished job
        du = getDiskTime();     // measure disk
        this_thread::sleep_for(chrono::milliseconds(500)); //wait
    }
}

它通过引用传递的原子(即避免数据竞争)变量与主线程通信。

您的处理循环如下所示:

atomic<bool> finished=false;            // tell diskmonitor that the processing is ongoing
atomic<double> diskusage=0;             // last disk usage read by diskmonitor
thread t(diskmonitor, ref(diskusage), ref(finished));   // launch monitor
for (int i = 0; i < 1000; i++)
{
    ...
    print_done_percentage();

    while (diskusage >= 90) {    // disk usage is filled in background
        std::cout << "The disk usage is over " << diskusage << ".I'll wait...\n";
        this_thread::sleep_for(chrono::milliseconds(500));
        }
    ...
}
finished = false;           // tell diskmonitor that i't's finished, so that it ends the loop
t.join();                   // wait until diskmonitor is finished. 

此示例使用标准 C++ 线程。当然,您可以使用特定于操作系统的线程编写类似的代码。

于 2014-09-03T21:18:16.277 回答