Форум: "Система";
Текущий архив: 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.048 c