Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > как уменьшить нагрузку на процессор


Автор: Jade 14.11.2008, 16:58
Добрый день.
Один из модулей моей программы выполняет такую задачу :
пользователь в нем задает папку, а программа обрабатывает в цикле файлы в этой папке. Анализирует эти файлы, и в зависимости от результата удаляет-перемещает в разные папки и т.д. Ну, в общем все тривиально.
Все уже написано и работает правильно, кроме одного но:

возьмем к примеру ситуацию, когда в папке 100 файлов, программа уже запущена и выполняется.
пользователь видит прогресс-бар, отображающий сколько файлов уже выполнено, и результат на лейбле (обработано: 45 из 100).
как только эту программу сворачивают либо двигают окно в сторону (за шапку), программа подвисает.
обработка файлов продолжается, но отображение на форме останавливается, и прогрессбар.Value остается на месте. появляется курсор-песочные часы. И это продолжается до тех пор, пока все файлы не обработаны.
Странно, но зависает в то время и QIP Infium, а остальные приложения работают нормально.

Интуитивно догадываюсь что нужно выполнять эту обработку в каком-то отдельном потоке, и присвоить ему приоритет поменьше, и чтобы ресурсов жрал меньше. Если так и нужно, то подскажите пожалуйста как это сделать (пишу на c#, .net 2.0)
Если нужно сделать по другому - буду очень благодарен за советы.
Спасибо заранее.

Автор: Voyager 14.11.2008, 17:17
1) Вставить в цикле в нужные места Apllication.DoEvents() (проще)
2) Использовать потоки или BackgroundWorker (посложнее)

Автор: Jade 14.11.2008, 17:34
Цитата

1) Вставить в цикле в нужные места Apllication.DoEvents() (проще)

Ура, заработало! Спасибо. Век живи - век учись smile
Про BackgroundWorker почитаю еще.

Автор: Rififi 14.11.2008, 20:06
DoEvents - это кривизна, используй потоки, как советуют

для потоков потребуется написть обёртку для доступа к контролам

Код

void AffectControl(MethodInvoker mth)
{
    if (InvokeRequired)
        Invoke(mth);
    else
        mth();
}



вызывать так:

Код

// вместо this.progressBar1.Value = ...
AffectControl(delegate()
    {
        this.progressBar1.Value = ...
    });


В случае с BW даже этого не надо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)