Форум: "Основная";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизИнтерактивонсть. Найти похожие ветки
← →
NiGGa © (2005-12-22 15:32) [0]Доброго времни суток.
Собственнозадача простая. Но как-то красивое решение не приходит.
Есть поток выполняющий длительные вычисления. прогресс выполнения задачи тяжело определяется, потому пользователю в это время предоставляется погиратся окошком с прогрессбаром "бесконечным". Вопрос в том как постоянно прорисовывать это окошко, при условии что желательно эти процедуры нек помещать в тело потока с вычислениями.
← →
evvcom © (2005-12-22 15:37) [1]а оно и не должно прорисовываться в доп. потоке.
Что значит "поиграться"?
← →
Digitman © (2005-12-22 15:39) [2]Тот самый доп.поток "с вычислениями" может периодически или эпизодически средствами Postmessage() посылать окну (с прогресс-баром) некое предопределенное сообщение с параметрами, определяющими требуемое состояние програсс-бара
Окно-приемник, получив такое сообщение, модифицирует состояние прогресс-бара должным образом и продолжает баловать юзера немедленной реакцией на его судорожные и бестолковые действия с мышью/клавой
← →
NiGGa © (2005-12-22 15:44) [3]Если сообщение сделанное постом будет долго идти? а SendMessage уже не красивое решение.
Дело в том что условие поставленное в вопросе, опирается на то, что доступа к коду производящему вычисления у меня нет, он "внешний", и соответственно никаких сообщений по-поводу своего статуса не генерирует:(
Потому и нужно, что-бы прогрес "сам рисовался".
← →
NiGGa © (2005-12-22 15:45) [4]Это по сути есть некое подобие Експрореровского прогресс-бара, который рисуется, но информативностью не обладает :)
← →
Zeqfreed © (2005-12-22 15:50) [5]NiGGa © (22.12.05 15:32)
Возможно, есть смысл реализовать лишь индикатор того, что процесс идет, без явного указания выполненной доли операции. Например, такой, который можно наблюдать при загрузке Windows XP.
← →
Digitman © (2005-12-22 15:50) [6]
> Если сообщение сделанное постом будет долго идти? а SendMessage
> уже не красивое решение
какая нафих разница ?
SendMessage - синхронный вызов, PostMesssage - асинхронный.
Другой вопрос, что при "нагруженности" потока-приемника синхронный вызов будет "висеть" до тех пор пока поток-пириемник не сподобится обрпаботать сообщение. в то время как асинхронный вызом действует по принципу "плюнул и поехал дальше"
← →
NiGGa © (2005-12-22 15:51) [7]Вопрос смысла уже решен, не ясны саособы реализации.
← →
Leonid Troyanovsky © (2005-12-22 15:54) [8]
> NiGGa © (22.12.05 15:32)
> Собственнозадача простая. Но как-то красивое решение не
Все тяжелые вычисления выводятся в отдельный процесс.
По окончанию которых он об этом извещает запустившего.
Никакие прогрес-бары здесь не помогут, потому, что, собс-но,
нет никакой информации о проценте выполнения задачи.
--
Regards, LVT.
← →
Digitman © (2005-12-22 15:54) [9]способы тебе уже подсказаны - один поток посылает сообщение и едет дальше, другой получив это сообщение обновляет состояние прогресс-бара
← →
Anatoly Podgoretsky © (2005-12-22 15:55) [10]TAnimate
← →
NiGGa © (2005-12-22 15:57) [11][6] Digitman © (22.12.05 15:50)
Собственно асихнронные сообщения могут придти тогда, когда они уже не нужны по сути.
И главная задача в том, что нет возможности модификации кода вычислений, т.е. вставить меж строк в цыкле ПостМессаге и тому подобное, не имею возможности.
← →
Digitman © (2005-12-22 16:03) [12]
> асихнронные сообщения могут придти тогда, когда они уже
> не нужны по сути
кому ?
← →
Digitman © (2005-12-22 16:07) [13]
> нет возможности
тебе же А.П. сказал - ИМИТИРУЙ активность приложения любой анимацией !
пусть даже и не отражающей действительность ..
юзеру ж важно другое : аппликация что-то там делает и не зависла ..
← →
NiGGa © (2005-12-22 16:07) [14][8] Leonid Troyanovsky © (22.12.05 15:54)
Никакие прогрес-бары здесь не помогут, потому, что, собс-но,
нет никакой информации о проценте выполнения задачи.
Как было сказано прогрес-бар рисуется "бесконечным", это делается потому-что заказчику хочется интерактива. Он должен видеть что "что-то происходит".
[9] Digitman © (22.12.05 15:54)
Повнимательней пожалйста прочтите второй абазц [3].
[10] Anatoly Podgoretsky © (22.12.05 15:55)
Пробовал. Но у меня в процессе вычислений на форме отрисовывается только анимация, и больше ничего. Там еще хотелось бы иметь лейбл с надписью о количестве прошедшего времени.
и как заметил Digitman[2] бестлковому юзеру таки хочется судорожно потягать окошко :)
← →
Digitman © (2005-12-22 16:11) [15]
> NiGGa © (22.12.05 16:07) [14]
> Повнимательней пожалйста прочтите второй абазц [3].
то что внедриться в код доп.потока ты не имеешь возможности - это я понял.
у тебя единственный выход - гонять по кругу прогресс-бар
на то есть таймер, рандомная ф-ция и прочие прибабахи, которые управляя св-вом Position того самого прогресс-бара позволят сымитировать для юзера "бурную деятельность" аппликации
← →
NiGGa © (2005-12-22 16:13) [16]Я прошу прощения, плохо сформулировал видимо задачу.
Вычислениям нужно много ресурсов, потому получается, что на отрисовку формы они выделяются крайне редко, или вообще не выделяются во время работы потока с вычислениями. Постоянной отрисовки формы нет = нет интерактива(от закакзчика).
Ставить мелкий приоритет на поток тоже не хочется ввиду сильно большой жертвой времени выполнения ради интреактива.
[13] Digitman
Пользователю хочется что-бы форму можна было еще потягать, работа у них нервная, а это успокаивает. Наличие анимации, действительно создает вид, но не дает возоможности "игратся" с окном. И "жалко" как-то отказать заказчику в такой маленькой слабости :)
← →
evvcom © (2005-12-22 16:28) [17]
> Ставить мелкий приоритет на поток тоже не хочется ввиду
> сильно большой жертвой времени выполнения ради интреактива.
А мелкий приоритет совсем не означает, что этому потоку будет выделяться малое количество процессорного времени. Даже с минимальным приоритетом ты не увидишь в TaskManager, что процессор простаивает, он будет нагружен на 100%. А основной поток получит право незамедлительного реагирования на баловство пользователя.
← →
Digitman © (2005-12-22 16:37) [18]
> Наличие анимации, действительно создает вид, но не дает
> возоможности "игратся" с окном
это почему же ?
обоснуй ...
← →
NiGGa © (2005-12-22 18:06) [19]это почему же ?
обосновать могу только полученными практически результатами. У меня анимация и прочие контролы формы и сама форма прорисовывается, с этим все отлично, проблема только в том что ее "потягать" нельзя. К тому же применение ее(такой формы) без доп.потока(доп. он только по названию. это по сути поток с вычислениями), т.к. не для всех вычислений создаю отдельный поток, немного затруднительно.
← →
Digitman © (2005-12-22 18:11) [20]
> проблема только в том что ее "потягать" нельзя
значит. у тебя ошибка в 17-й строке
← →
NiGGa © (2005-12-22 18:17) [21]:)
скорее в 62
← →
NiGGa © (2005-12-22 18:24) [22]Как-то раз я таки в событии таймера поставил не отрисвоку формы, а Apllication.ProcessMessages. И форма отзывалась на пользовательские действия, но имел место артефакт такой, что хоть форма интерактива и FormStyle := fsStayOnTop, при клике мышкой на форму, что под ней, той нижней форме передавался фокус.
← →
Digitman © (2005-12-23 08:31) [23]
> той нижней форме передавался фокус
а почему бы ему не передаваться ?
StayOnTop этому никак не препятствует.
Для этого существует модальный режим показа формы - Form.ShowModal
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.05 c