2014-09-03 59 views
2

在驱动器G上有几个操作正在完成。我的程序应该从文件读取数据。当磁盘使用率非常高(> 90%)时,程序应该减慢读取速度,以免干扰其他使用磁盘的进程。
显然,我想,在调用get_data_from_file()之后检查Disk Time将导致计数器返回非常高的百分比,因为刚刚使用了该磁盘。你可以在image上看到。如何使用性能计数器控制从文件读取?

关于如何正确检查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); 
     } 
    } 
} 

回答

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++线程。当然,你可以编写类似于操作系统特定线程的东西。

+0

我以完全相同的解决方案结束:)我登录删除我的文章,但你已经回答了:)但是,我仍然发现你的答案有帮助,因为我使用了C'CreateThread',并且我喜欢你的C++线程的用法。 – theateist 2014-09-04 02:34:49