Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

AntiFreeze цикла   Найти похожие ветки 

 
Leviathan   (2004-03-21 22:02) [0]

Имеетсся большой цикл, который проводит вычисления в течении довольно длительного времени (неск. часов). Во время работы этого цикла прога наглухо подвисает: кнопки не нажимаются, окно не двигается и.т.д. Хотелось бы от этого избавится.

Была одна идея - засунуть весь цикл в таймер с очень маленьким интервалом. В принципе помогает, но есть ли более приличные способы?

Спасибо!!


 
Cobalt ©   (2004-03-22 00:29) [1]

Надо просто в этом вычислении (если оно работает в цикле (или рекурсии - не важно)) в определённых местах проверять время - если с последнего обновления прошло 1 (2, 3 ) сек., то вызывать Application.ProcessMessages. И записывать, что, мол, обновились. И снова проверять.

Хотя нет, лучше для этого создать отдельный поток, и дизейблить необходимые контролы до тех пор, пока не закончится процесс (то бишь поток) вычислений.


 
Anatoly Podgoretsky ©   (2004-03-22 00:30) [2]

Ну стандартный ответ, ты хочешь обрабатывать сообщения системы, но делаешь это. ProcessMessages тебе поможет.


 
Германн ©   (2004-03-22 02:16) [3]

Наверно тут стоит еще раз продумать задачу. Нужно ли иметь возможность нажимать кнопки, и если да то какие можно, а какие нет. Какие действия может выполнять программа до окончания цикла, а какие нет.
А дальше принять решение. Что лучше использовать в данном конкретном случае.
Лично я бы, не имея пока уточнений, при старте столь длительного цикла, убрал бы окно программы с экрана с одновременным созданием значка в Tray, где Hint"ом бы показывалась "какая-либо разумная" информация о ходе вычислений. Кроме того, предпринял бы меры запрещающие закрытие сей программы без согласия пользователя. А после завершения вычислений выдавал бы сообщение пользователю о нем, плюс убирал бы значек в Tray и восстанавливал бы окно программы.

Имхо. При "неск. часов" - разумность применения потоков не имеет смысла.


 
Alex Konshin ©   (2004-03-22 07:27) [4]

Имеет, так как проверять наличие сообщений во время цикла это может быть накладно, а так просто создал отдельную нить, пусть она считает, а основной поток оставить для ожидания и обработки сообщений. Это еще нужно потому, что в противном случае окно программы будет перемещаться и перерисовываться с ОЧЕНЬ большими тормозами (если часто проверять - в пустую тратим время, если редко - тормоза). А с нитями тормозов не будет.


 
Германн ©   (2004-03-23 00:36) [5]

2 Alex Konshin ©   (22.03.04 07:27) [4]
Имхо, если расчеты длятся несколько часов, трудно предположить что же еще может делать программа, пока расчеты не закончатся. И зачем в это время нужно видеть окно программы?


 
Alex Konshin ©   (2004-03-23 03:27) [6]

А куда ты его денешь? Спрячешь? А если прервать захочется? А если shutdown и для корректного завершения нужно делать нечто не совсем тривиальное (сохраниться на диск, например)? Если будешь проверять раз в секунду - бесполезно потеряешь время, если реже, то будет тормозить хотя бы тот же shutdown, я уж не говорю про перерисовку.
Я совершенно не понимаю, что такого трудного в том, чтобы перенести вычисления в отдельный поток, а уж в основном делай все, что тебе угодно, можешь и окно спрятать, если уж так хочется.


 
Германн ©   (2004-03-23 04:10) [7]

2 Alex Konshin ©   (23.03.04 03:27) [6]
>Я совершенно не понимаю, что такого трудного в том, чтобы >перенести вычисления в отдельный поток, а уж в основном делай >все, что тебе угодно, можешь и окно спрятать, если уж так >хочется.

Трудного-то может и нет. Но...

>А куда ты его денешь? Спрячешь?
Спрячу. Оставлю только иконку в Tray.

>А если прервать захочется?
В меню, вызываемом щелчком правой кнопки мышки по иконке в Tray"е вставлю пункт "Прервать".

>А если shutdown и для корректного завершения нужно делать нечто >не совсем тривиальное (сохраниться на диск, например)?
Обработаю QueryEndSession, кстати согласно Вашим рекомендациям.


 
Alex Konshin ©   (2004-03-23 06:08) [8]

>А если прервать захочется?
В меню, вызываемом щелчком правой кнопки мышки по иконке в Tray"е вставлю пункт "Прервать".

>А если shutdown и для корректного завершения нужно делать нечто >не совсем тривиальное (сохраниться на диск, например)?
Обработаю QueryEndSession, кстати согласно Вашим рекомендациям.

А ты подумал, кто эти сообщения обрабатывать будет? То есть тебе придется вставить в цикл расчетов проверку на наличие сообщений. Вот именно об этом я и толкую.


 
Германн ©   (2004-03-23 15:15) [9]

Да, недодумал :(((


 
Mim   (2004-03-23 19:17) [10]

Alex Konshin ©   (23.03.04 06:08) [8]

Всетаки с треем несколько нестандартное решение, может не стоит пугать пользователя, а делать "как положено"?


 
Alex Konshin ©   (2004-03-23 19:33) [11]

Я вроде про трей не говорил...
А как положено?


 
Mim   (2004-03-23 20:04) [12]

Стандартное приложение представляет собой окно с элементами управления, без всяких там ныряний в трей. При вычислении каких либо данных обычно выводится индикатор вычисления, кнопка отмены и тп. Так же неплохом тоном счиается оставлять пользователю возможность сворачивания окна. Пускай он сам решает хочет он этого или нет.
Приведу пример - Nero Burning Rom.


 
Alex Konshin ©   (2004-03-23 22:45) [13]

А я-то тут причем?


 
evvcom ©   (2004-03-24 09:37) [14]

Зачастую также в сложных алгоритмах расчета имеется несколько долгих циклов внутри всего цикла расчета, поэтому в случае с ProcessMessages эту процедуру надо вставлять в несколько мест и определить эти оптимальные места довольно все-таки сложно. Понавставлять редко - плохо, часто - тоже ничего хорошего. Поэтому я тоже все же за потоки. Пусть ОС возьмет на себя эту задачу.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.588 c
3-1082027419
Vitaly
2004-04-15 15:10
2004.04.11
Ребята, не могу найти d5adoupdate2.exe


1-1082562776
Insert
2004-04-21 19:52
2004.04.11
Запуск readme


8-1071198758
Japan
2003-12-12 06:12
2004.04.11
Рисование на рабочем столе


8-1071408395
Слава-22
2003-12-14 16:26
2004.04.11
Воспроизведение mp3 файла


1-1082464630
ReNoiZer
2004-04-20 16:37
2004.04.11
Tраблы с MIDAS в D7 после установки Delphi 8 for .NET