Окт 13

Предотвращение зависания приложения в случае медленной обработки отдельных событий

Предположим, что в вашей программе обработка какого-то события является очень ресурсоемкой, занимая процессор в течение нескольких минут. Несмотря на то что Windows является многозадачной операционной системой, выделяющей принудительно кванты времени для выполнения других приложений, пользователь будет не в состоянии что-нибудь сделать с этой злополучной программой, пока не завершится указанная обработка. Он не сможет даже перетащить окно в другое место экрана или закрыть приложение. Внешне это выглядит как зависание приложения. Вряд ли пользователю понравится такое поведение программы.
Рассмотрим эту проблему на конкретном примере. Предположим, в приложении имеется обработка некоторой команды меню (например, Play) с помощью следующей функции:
void OnPlayO {
while (IfReadData.eofO) { fReadData.read(buf, 512); DoSomethingO ; // какая-нибудь обработка } }
Здесь fReadData — это объект класса ifstream. В цикле while осуществляютс чтение файла fReadData блоками по 512 байт и последующая обработка каждогс блока с помощью функции DoSomething. Допустим, что размер файла достигает 5 Мбайт, а время выполнения функции DoSomething составляет 10 мс.