C++ 如何使用性能计数器控制文件读取?
有几个操作正在驱动器G上进行。我的程序应该从文件中读取数据。当磁盘使用率非常高(>90%)时,程序应该减慢读取速度,这样就不会干扰使用磁盘的其他进程。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
显然,我想,调用
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++线程使用。