Главная страница
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.029 c
7-1075719213
Creator
2004-02-02 13:53
2004.04.11
как работать с COM портами ???


3-1081621962
Rosik
2004-04-10 22:32
2004.04.11
Подскажите пожалуйста! Как в DBgrid в title картинку вставить


6-1079823666
Автор
2004-03-21 02:01
2004.04.11
Как программе использовать для вычислений несколько компов в сети


1-1079950071
Leech
2004-03-22 13:07
2004.04.11
Delay во время выполнения либо ответ от rar...


14-1082230252
Черный прапорщик
2004-04-17 23:30
2004.04.11
Вот интересно мнение, программеров, разрабатывающих в одну «морду