Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1136846116
heruvim
2006-01-10 01:35
2006.01.29
Печать в Delphi


5-1121466615
ATarget
2005-07-16 02:30
2006.01.29
Как создать кнопочку рядом со свойством в инспекторе объектов


15-1136197216
Adil
2006-01-02 13:20
2006.01.29
После Windows Vista WinAPI небудет??


4-1132302505
lsw
2005-11-18 11:28
2006.01.29
Работа с dll


2-1137345737
Sirko
2006-01-15 20:22
2006.01.29
FastReport





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский