
Есть ли способ ограничить скорость чтения программой файлов, не замедляя при этом саму программу?
решение1
В Windows Vista и выше вы можете установить приоритет ввода-вывода процесса. Это не ограничит скорость, но даст другим процессам приоритет над вашим процессом и позволит им получить приоритет. Для этого есть скрытые API, но, похоже, вы ищете инструмент. Когда вы устанавливаете приоритет процесса с помощью диспетчера задач на «Ниже нормы» или «В режиме ожидания», приоритет ввода-вывода также падает.
Этот вопрос на suepruser содержит больше информации:
Как изменить приоритет ввода-вывода процесса или потока в Win7?
Он также ссылается на этот проект, который позволяет вам устанавливать приоритет ввода-вывода.
решение2
Не уверен насчет аппаратных или специфичных для ОС решений... Но очевидное бросается в глаза (простите за грубую реализацию):
const long long maxBytesPerSec = 1048576;
static long long bytesRead = 0;
static long long secondsElapsed = 1;
istream & ReadBytesThrottled( istream & s, char * buffer, long long bytesToRead )
{
while( (bytesRead+bytesToRead) / secondsElapsed > maxBytesPerSec ) {
// Wait and update secondsElapsed
}
s.read(buffer, bytesToRead);
if( s.good() ) bytesRead += bytesToRead;
return s;
}
void ResetThrottle()
{
bytesRead = 0;
secondsElapsed = 1;
}
Это имеет значение только если вы читаете фрагменты. Я полагаю, вы могли бы вывести из потока и перегрузить соответствующие методы. Начинает становиться немного противно. Но это простой и быстрый обходной путь, если вы не можете найти решение на более низком уровне.