C++ 如何使用性能计数器控制文件读取?

C++ 如何使用性能计数器控制文件读取?,c++,performancecounter,resource-monitor,C++,Performancecounter,Resource Monitor,有几个操作正在驱动器G上进行。我的程序应该从文件中读取数据。当磁盘使用率非常高(>90%)时,程序应该减慢读取速度,这样就不会干扰使用磁盘的其他进程。显然,我想,调用get_data_from_file()后检查磁盘时间将导致计数器返回非常高的百分比,因为磁盘刚刚使用过。你可以在地图上看到 关于如何正确检查磁盘时间,有什么建议吗 PDH_HQUERY query; PDH_HCOUNTER counter; PdhOpenQuery(NULL, 0, &query); PdhAddCou

有几个操作正在驱动器G上进行。我的程序应该从文件中读取数据。当磁盘使用率非常高(>90%)时,程序应该减慢读取速度,这样就不会干扰使用磁盘的其他进程。
显然,我想,调用
get_data_from_file()
后检查
磁盘时间将导致计数器返回非常高的百分比,因为磁盘刚刚使用过。你可以在地图上看到

关于如何正确检查
磁盘时间
,有什么建议吗

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);
       }
   }
}
PDH\uhquery;
PDH_h计数器;
PdhOpenQuery(NULL、0和query);
PdhAddCounterA(查询“\\LogicalDisk(G:)\\\%Disk Time)”,0,&计数器;
PdhCollectQueryData(查询);
自动获取磁盘时间=[&]()->双精度
{
PDH_FMT_反值FMT计数器;
PdhCollectQueryData(查询);
PdhGetFormattedCounterValue(计数器、PDH_FMT_DOUBLE、0和FMT计数器);
返回fmtCounter.doubleValue;
};
对于(…)
{
从_文件()获取_数据_;
打印完成百分比();
double diskUsage=getDiskTime();
如果(磁盘使用率>=90)
{            

std::cout一个独特的监视线程可以帮助您测量磁盘使用情况,并且更独立于写操作

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

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
    }
}
void diskmonitor(原子和du、常量原子和完成){
当(!finished){//主进程完成作业后立即停止循环
du=getDiskTime();//测量磁盘
此线程::sleep_for(chrono::毫秒(500));//等待
}
}
它通过引用传递的原子(即避免数据竞争)变量与主线程通信

您的处理循环如下所示:

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. 
atomic finished=false;//告诉diskmonitor处理正在进行
原子磁盘使用率=0;//diskmonitor读取的上次磁盘使用率
线程t(diskmonitor,ref(diskusage),ref(finished));//启动监视器
对于(int i=0;i<1000;i++)
{
...
打印完成百分比();
而(diskusage>=90){//disk usage在后台填写

STD::我用完全相同的解决方案结束:“我登录删除我的帖子,但是你已经回答:”但是,我仍然发现你的答案是有用的,因为我使用了C<代码> CuraType < /Cord>,我喜欢你的C++线程使用。