88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
1

Форма перестаёт отвечать

21.07.2016, 22:01. Показов 1305. Ответов 8
Метки нет (Все метки)

Во время выполнения длительных операций например с циклами, когда сотни итераций а то и тысячи, и времени на итерацию уходит довольно много, форма перестаёт отвечать..
Вот я думаю, я больше чем просто уверен что можно избежать этого "Не отвечает".. за обно хотелось и прогрессбар прикрутить..

Добавлено через 40 секунд
Я код не выкладываю, потому что задача совсем общая, зависание при длинных циклах
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2016, 22:01
Ответы с готовыми решениями:

Программа перестаёт отвечать системе, но при этом работает.
Собтвенно вот то что в заголовке. Использую progressbar и во время работы с файлом показывается...

После загрузки exe на сервер, файл перестаёт работать
Решил сделать ф-цию обновления для моей программы, а что бы каждый раз не заходить в браузер,...

SSD перестаёт отвечать
Добрый день уважаемые форумчане. Столкнулся со следующей проблемой: установил SSD диск на HP...

Выключается монитор, и перестаёт отвечать компьютер
Здравствуйте, с компьютером возникает такая проблема: выключается монитор, и компьютер дальше...

8
Заблокирован
21.07.2016, 22:12 2
Используйте в самом начале или конце цикла Application.ProcessMessages. Все доступные кнопочки на время цикла нужно заблокировать.
1
82 / 82 / 39
Регистрация: 17.02.2016
Сообщений: 464
21.07.2016, 22:36 3
используйте потоки
вот самое простое решение вашей проблемы
Обработать в программе зависание при выполнении SQL запросов
1
88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
21.07.2016, 22:42  [ТС] 4
AllFree,
Цитата Сообщение от AllFree Посмотреть сообщение
начале или конце
перед циклом, или же непосредственно в теле цикла?
0
82 / 82 / 39
Регистрация: 17.02.2016
Сообщений: 464
21.07.2016, 22:46 5
Application.ProcessMessages - хорошо но форма один фиг будет виснуть, не так жестко но все же
потоки ваше все
0
Заблокирован
21.07.2016, 22:52 6
Код
 

for i:=1 to 1000000000 do
begin
    Application.ProcessMessages;
    If Application.Terminated then exit;

    // Здесь Ваш код

end;
или так:

Код
for i:=1 to 1000000000 do
begin
    // Здесь Ваш код

    Application.ProcessMessages;
    If Application.Terminated then exit;
end;
Добавлено через 5 минут
Цитата Сообщение от HiredKiller Посмотреть сообщение
Application.ProcessMessages - хорошо но форма один фиг будет виснуть, не так жестко но все же
потоки ваше все
Советую прочитать справку. У автора темы код после каждой итерации выводит куда-то результат. Учитывая, что из потока нельзя обращаться напрямую к форме, (нужна синхронизация), это будет чревато легким зависанием.
0
5361 / 4194 / 1365
Регистрация: 14.04.2014
Сообщений: 19,043
Записей в блоге: 18
22.07.2016, 08:05 7
обсосано уже до костей на этом форуме
processmessages довольно затратная операция
поэтому 1000000 processmessages будет выполняться гораздо дольше
да еще есть подводные камни типа повторного входа в обработчики
имеем ситуацию, когда лечение хуже болезни

при любых признаках долгих вычислений выносим их в поток
если при этом требуется обновлять прогресс на форме, то
в цикле потока каждый раз проверяем, не прошло ли с последнего обновления, например, 500 мсек, и если да,
то в процедуре Synchronize() обновляем форму и продолжаем вычисления
0
70 / 71 / 23
Регистрация: 14.10.2013
Сообщений: 532
22.07.2016, 08:49 8
Цитата Сообщение от AllFree Посмотреть сообщение
Учитывая, что из потока нельзя обращаться напрямую к форме, (нужна синхронизация), это будет чревато легким зависанием
Никаких выдимых глазу человека зависаний не будет, если использовать синхронизацию грамотно.
0
5361 / 4194 / 1365
Регистрация: 14.04.2014
Сообщений: 19,043
Записей в блоге: 18
22.07.2016, 15:51 9
если не открывать закрывать формы и не читать файлы, то действительно ничего не должно быть заметно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2016, 15:51
Помогаю со студенческими работами здесь

Работаю с файлами в Pascal, блокнот перестаёт отвечать
Работаю с файлами в pascal, переписываю исходный файл.pas в новый файл, при открытии нового файла...

Под нагрузкой видеодрайвер перестаёт отвечать и восстанавливается
Всем доброго времени суток, возникла проблема с видеодрайвером, под нагрузкой драйвер перестаёт...

Добавление записи в Listview(1 форма) через Диалоговое окно(3 форма) другой формы (2 форма)
Всем доброго дня и с наступающими праздниками! Знаю, тема 7 частых вопросов по WinForms уже не...

Форма 1 вызывает форму 2, форма 2 закрывается, форма 1 продолжает работать дальше
Вынес предстартовые действия формы1 в форму2 (там у меня проверка существования файлов, их закачка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru