Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > .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 | ||
Ура, заработало! Спасибо. Век живи - век учись ![]() Про BackgroundWorker почитаю еще. |
Автор: Rififi 14.11.2008, 20:06 | ||||
DoEvents - это кривизна, используй потоки, как советуют для потоков потребуется написть обёртку для доступа к контролам
вызывать так:
В случае с BW даже этого не надо... |