2014-09-03 1 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++ 스레드입니다. 물론 OS 특정 스레드와 비슷한 코드를 작성할 수 있습니다.

+0

정확하게 똑같은 해결책으로 끝났습니다. :) 내 게시물을 삭제하기 위해 로그인했지만 이미 답을 보았습니다. :) 그러나 C, CreateThread를 사용하고 C++ 스레드 사용을 좋아하기 때문에 여전히 답을 찾았습니다. – theateist