Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

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

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

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

Спасибо!!


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

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

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

Спасибо!!


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

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

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


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

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

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


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

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


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

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


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

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

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


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

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

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


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

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


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

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


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

2 Alex Konshin ©   (22.03.04 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, я уж не говорю про перерисовку.
Я совершенно не понимаю, что такого трудного в том, чтобы перенести вычисления в отдельный поток, а уж в основном делай все, что тебе угодно, можешь и окно спрятать, если уж так хочется.


 
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, кстати согласно Вашим рекомендациям.


 
Германн ©   (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, кстати согласно Вашим рекомендациям.

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


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

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

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

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


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

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


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

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


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

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

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


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

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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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



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

Форум: "Система";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.03 c
9-1068290513
cyborg
2003-11-08 14:21
2004.05.09
Создание игры для начинающих


9-1070788187
Yegor
2003-12-07 12:09
2004.05.09
Как написать тренер?


7-1079410905
Kair
2004-03-16 07:21
2004.05.09
Ctrl + Alt + Del


1-1082471791
UnDISCOvery
2004-04-20 18:36
2004.05.09
ActionToolBar. Проблемы с отрисовкой. Как бороть ???


1-1082644792
моё_имя
2004-04-22 18:39
2004.05.09
закрытие MDI-формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский