.NET 4.x Зависание программы при выполнении длительного цикла26.01.2015, 16:26. Показов 16409. Ответов 27
Метки нет (Все метки)
В моей программе выполняется долго, очень долго цикл, так как много данных обрабатывается.
Программа работает и отрабатывает цикл нормально. Но на время выполнения цикла, программа как бы зависает. Как это происходит. Если переключиться на другую программу, а потом вернуться, то в тайтле программы добавляется текст "Не отвечает" и при клике на программу она покрывается белым фоном. Такое состояние до момента завершения цикла, после чего программа возвращается в нормальное состояние и в цикле все выполнено правильно. У меня стоит задача убрать именно это неприятное явление, а не исправлять код, так как код работает хорошо. Я пробовал выводить цикл в отдельный поток через BackgroundWorker, но ничего не меняется. Пробовал также добавлять в каждый шаг итерации цикла Application.DoEvents();, но также не помогает. Какие еще есть варианты?
0
|
|
| 26.01.2015, 16:26 | |
|
Ответы с готовыми решениями:
27
Зависание формы при выполнении цикла Постепенное выполнение программы/зависание программы при выполнении При выполнении кода, полное зависание программы |
|
|
|||||||
| 09.03.2015, 00:29 | |||||||
|
Добавлено через 5 минут Вот пример, все работает, прогресс бар бежит, без Sleep:
0
|
|||||||
| 09.03.2015, 00:32 [ТС] | |
|
Это не мой код, это код который идет как экспертный с рекомендацией Майкрософт.
Если посмотреть МСДН, то вроде все правильно. Должно работать. И оно работает, но только с "засыпание". А без "засыпания" ни один экспертный пример не работает. Вот в чем интерес. Другими словами, я что хочу сказать: может изначально этот BackgroundWorker не правильно создан Майкрософтом? Так как без засыпания не работает.
0
|
|
| 09.03.2015, 00:48 [ТС] | |||||||||||
|
Я уже писал выше, что сейчас пример на WPF приложении, а тему начинал на WindowsForms.
Поэтому код приведу на WPF.
Добавлено через 3 минуты Также, можно по этой ссылке скачать на странице весь код проекта: http://outcoldman.com/ru/archi... %BA%D0%B5/
0
|
|||||||||||
|
|
||||||||||||
| 09.03.2015, 01:34 | ||||||||||||
|
Добавлено через 1 минуту
Но и этого не достаточно. Дело в том, что если вы сейчас запустите этот пример, с Dispatcher.Invoke - интерфейс тоже обновляться скорее всего не будет. И вот почему. Когда вы вызываете Invoke, в очередь сообщений добавляются команды. Главный поток обрабатывает сообщения и обновляет интерфейс окна. Но вы вызываете Dispatcher.Invoke так часто, что главный поток просто не успевает отрисовать интерфейс, все его время уходит на обработку сообщений, которые вы ему посылаете через Invoke. Поэтому интерфейс висит. В WinForms такая ситуация разруливается, но в WPF - нет. Я не знаю почему, я не особый спец в WPF. Пэтому, вам нужно вызывать событие ProgressChanged немного реже, что бы главный паоток успевал обработать очередь сообщений. Вот пример вашего цикла. Здесь осовное время крутится внутри вложенного цикла. И только после выхода из вложенного цикла - вызывается ProgressChanged:
1
|
||||||||||||
| 09.03.2015, 11:10 [ТС] | |||||||||||
|
Storm23,
К сожалению, вопрос не в Invoke. Я проверил на WindowsForms и на WPF. Проблема заключается, как Вы правильно обнаружили, в определенном количестве времени, которое затрачивается на прохождение одной итерации в цикле до вызова ProgressChanged для обновления интефейса основного потока. Т.е. Thread.Sleep(1); просто необходим был, чтобы сделать задержку на не менее минимальное время для срабатывания ProgressChanged. Я поставил Ваш дополнительный цикл вместо Thread.Sleep(1); и все работает, даже без Invoke. Даже так все работает, если дать достаточное время на обновление интерфейса.
1 миллисекунды явно много.
0
|
|||||||||||
|
Администратор
|
||
| 09.03.2015, 12:58 | ||
|
0
|
||
| 09.03.2015, 23:15 [ТС] | ||
|
Решение я уже нашел. Подсчитывается время, которое затрачивается на одну итерацию, если оно меньше определенного, то дополнительным циклом ждем эту разницу во времени. Таким образом достигается максимальная производительность и кооректное отображение прогрессбара.
0
|
||
| 09.03.2015, 23:15 | |
|
Чувствительность программы во время длительного цикла
Резкое зависание программы при частом запуске цикла
Зависание интерфейса при выполнении запроса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью.
Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
|
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза
Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
|
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма
Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
|
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости.
Решение:
Создан документ со следующими. . .
|
|
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово.
Решение:
Создан документ с единственным. . .
|
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Вычислить сумму и количество положительных элементов массива, расположенных в четных строках.
Решение:
Создан документ с. . .
|
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности.
. . .
|
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные.
. . .
|