|
51 / 51 / 13
Регистрация: 05.06.2008
Сообщений: 139
|
|
Анимация ожидания17.05.2010, 01:04. Показов 10812. Ответов 30
Метки нет (Все метки)
У меня в приложении есть длительные процессы, например подключение к удаленной базе данных, обычно в таких случаях я вывожу надпись типа "ждите", в этот раз я решил вывести gif-анимацию в TImage, но она во время выполнения процесса останавливается, пробовал играться с дочерним процессом - тоже не помогло, может кто подскажет как ее оживить во время выполнения процесса?
0
|
|
| 17.05.2010, 01:04 | |
|
Ответы с готовыми решениями:
30
Потоки и таймеры ожидания Задать время ожидания на чтение файла
|
|
3 / 3 / 1
Регистрация: 31.01.2010
Сообщений: 10
|
|
| 17.05.2010, 17:33 | |
|
Через поток делать надо.
0
|
|
|
|
|
| 03.02.2011, 09:31 | |
|
У меня такая же постановка задачи, но мне нужно вывести не просто картинку, а анимацию в иконке окна (то, что в левом верхнем углу, если неправильно обозвал). Ну и нарыл похожую тему: Анимация кнопки через ресурсы
1. Почему рекомендуют делать анимацию через поток? Ведь работать с VCL-компонентами через поток нельзя. Точнее, можно (ибо кто запретит), но код при этом может подглючивать. 2. Какая всё-таки общая технология? Работать по таймеру и обновлять ручками? Случай, когда приложение ничего не делает и просто рисует анимационный gif через TGIFImage я не рассматриваю, ибо постановка задачи сводится к прорисовке анимации на фоне работы программы. Мне казалось, что правильным было бы "долгий" процесс пустить в потоке, а отрисовку анимации делать в главном процессе по таймеру. Можно и не по таймеру, а через интерфейсы ожидания завершения потока по таймауту (где можно более точно настраивать интервалы, чем с таймером) - принципиальной роли нет. Суть в том, что отрисовка делается ручками через интервалы времени. Или всё-таки есть какие-то продвинутые методы (а то и встроенные)?
0
|
|
|
|
|
| 03.02.2011, 13:21 | |
|
1. ProgressBar
2. Запуск анимации в цикле в соответствии с какими-то параметрами выполняемого действия и break; по условию по окончании оного.
0
|
|
|
|
|
| 03.02.2011, 14:24 | |
|
Да, а ты ?
0
|
|
| 03.02.2011, 14:31 | |
|
Не по теме: Тогда ты спрашивал не у меня :) .
0
|
|
|
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
||||||||
| 03.02.2011, 15:14 | ||||||||
|
Теперь, что касается обновления канвы из потока. Да, Canvas изначально создан, как потоконебезопасный, но это не должно останавливать программиста в его использовании. Есть методы Lock, TryLock, Unlock, LockCount, которые позволяют устанавливать, снимать и получать состояние блокировки. Зачем нужна такая блокировка? Изменение содержимого должно происходить только из одного потока. При установке блокировки обновление из других потоков запрещается. Пример использования:
3
|
||||||||
|
|
|
| 03.02.2011, 15:34 | |
|
Висит на 98%, Вынь7.
0
|
|
|
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|
| 03.02.2011, 15:39 | |
|
LK, у меня нормально отрабатывает, проверял на WinXP и Win7.
Собственно говоря, из этого проекта нужно подчеркнуть только работу с канвой из потока, для этого я его и набросал.
1
|
|
|
|
|
| 03.02.2011, 15:45 | |
|
MikeSoft, я понял
. Просто запустил, посмотрел, за запусков десять только один раз таск_комплит, вот и написал, исходники не смотрел пока, но вещь нужная .
0
|
|
|
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|
| 03.02.2011, 15:48 | |
|
LK,
если найдёте ошибки - пишите или в ЛС, или в этой теме.Также, в исходник можно добавить проверку количества блокировок с помощью чтения свойства LockCount. Если LockCount равен нулю - остальные потоки имеют право изменять содержимое.
0
|
|
|
|
|
| 03.02.2011, 15:53 | |
|
0
|
|
|
|
||||
| 03.02.2011, 17:21 | ||||
|
MikeSoft, в параллельной теме высказал свои соображения: https://www.cyberforum.ru/post1339292.html Т.е. я был неправ или как?
Всякие TryLock и прочее - а внутри кодов VCL это делается или не делается? Потому что если при перерисовке каждой компоненты будет постояно делать lock-unlock, то это пипец какие накладные расходы получаются Добавлено через 24 минуты Добавлено через 4 минуты Добавлено через 5 минут И вот ещё, немного отвлечённый вопрос. У Canvas есть методы TryLock и прочее. Но ведь у самих компонент этого нет. Т.е. если к примеру, было бы нужно обновить из потока свойства кнопки или ещё что-то, то лочить нечего. Или фишка именно в том, что проблемы из потока могут возникнуть именно с Canvas'ом, и обусловлены они возможно перерисовкой компоненты по тем или иным событиям из главного потока? И ещё одно. Invalidate что делает?
0
|
||||
|
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
||||
| 03.02.2011, 17:40 | ||||
|
По поводу StringGrid'a - неплохо было бы увидеть описанный пример. В случае с отдельным потоком будет имитирована псевдопараллельность (с учётом приоритета потока и других факторов и ограничений, существующих в железной части, прорисовывающихся в ОС). Собственно говоря, из-за такой семафорной псевдопараллельности и возникают неприятные нюансы при доступе к некоторым объектам. Кстати говоря, для решения подобных проблем придумали ещё критические секции (TCriticalSection). ![]() Нужно же разработать бизнес-логику, продумать, где тебе необходимо отдавать приоритеты графической части, а где заставить процессор перегреваться от постоянной "калькуляции"... Нужен нетормозящий подсчёт и прорисовка? Два потока, минимальные изменения и готово (проект в аттаче).
1
|
||||
|
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|||
| 03.02.2011, 17:48 | |||
|
Изображения, которые присутствуют на "дополненных экземплярах" (таких, как TSpeedButton и других) также отрисовываются на канве. К проблемным местам потоков относятся все части приложения, которые способны перерисовываться, но не могут следить за правами доступа. Здесь уж проблема в том, что защитные механизмы либо плохо освещаются, либо плохо реализованы ("плохо" - с точки зрения интуитивной доступности).
0
|
|||
|
|
||||||||
| 03.02.2011, 18:16 | ||||||||
|
Но в настоящем у меня нет "тяжёлой" прорисовки. У меня есть лёгкая прорисовка - грубо говоря 5 раз в секунду обновить иконку окна. Картинка маленькая, задержки между прорисовками большие (сотни миллионов тактов). Я правильно понимаю, что при таком раскладе нормальным (а то и оптимальным) решением будет обновление картинки по таймеру в главном процессе? Т.е. пример по сути дела твой, но вместо второго потока (который "графический") будет таймер в главном процессе Добавлено через 2 минуты
0
|
||||||||
|
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|||||
| 03.02.2011, 20:41 | |||||
|
Я с этой проблемой столкнулся, когда разрабатывал систему удалённого управления рабочими станциями. Сначала подумал: получение изменившегося участка изображения + его отрисовка = должно занять время, не меньшее, чем 7-20 мс. Ну и думаю: заставлю-ка я главный поток активировать объект класса TTimer, в котором и сделаю прорисовку нужного региона, заодно и не буду мучатся с блокировками канвы. Так и сделал! В итоге, были заметны явные "рывки" при активации таймера, тратилось время на создание потока, на его остановку... после чего у меня у меня возник вопрос: "А зачем мне все эти прелести?". Оформил отдельный поток и проблема исчезла. Но в целом - подход нормальный, меньше возни с блокировками, но чуть большая нагрузка, а если учитывать, что операция не такая уж и ёмкая - то решение: использовать можно ![]() Но опять же, мне сложно представить проблему... обидно, что нет примера, интересно было бы посмотреть, разобраться.
0
|
|||||
|
|
|||||
| 03.02.2011, 22:15 | |||||
|
Да, забыл сказать. Суть то в чём. Данные слизываются из инета в потоке, а затем просто отображаются в таблицу на форму. Отображение на форму уже выполняется в главном процессе. Такой вариант, как удержание постоянного соединения в моём случае отсутствует. Что-то не подумал о том, что сие надо рассказать, дабы понималось, о чём идёт речь. Короче, в моём случае главная форма занимается только отрисовкой таблички, обслуживением меню, галочек-кнопочек и т.п. Т.е. вот примерно в такой модели всё это дело требуется Добавлено через 1 минуту Добавлено через 1 час 10 минут Попробовал с ручным обновлением иконки из главного процесса. Действительно, если начать перетаскивать окно, то можно наблюсти некоторое торможение. И оно понятно - при перетаскивании мышкой окна постоянно фигачат события по перерисовке, а потому события от таймера приходят не вовремя. Решил сравнить с двумя приложенными кодами ProgressShow. У меня Windows 7 Home Basic (32) Первый код как-то ещё работает, однако если в процессе рассчётов нажать на крестик (закрытие формы), то реакции нет и окно закрывается только по окончании подсчёта. Заметны периодические мерцания (за всё время 2-3 раза какое-то мерцание, как будто форма вся затёрлась и перерисовалась заново). Если потаскать окно в процессе рассчёта, то при повторном нажатии StartProgress программа попросту перестаёт работать (обновлять содержимое окна), а если её подвинуть, то содержимое вообще стирается Во втором варианте (когда два потока) вообще не работает. При нажатии на "Start" отображается счётчик 0, а потом тишина. По завершении расчёта кнопка появляется снова, но содержимое окна так и осталось неперерисованным. Для полного счастья надо бы этот же вариант программы, но чтобы вся перерисовка шла из главного процесса (без потоков). Чисто чтобы понять, проблема из-за прорисовки в потоке, или компилятор нагенерил код, который по каким-то причинам коряво работает под Windows 7
0
|
|||||
| 03.02.2011, 22:15 | |
|
Помогаю со студенческими работами здесь
20
Анимация ожидания
Анимация ожидания ответа ajax запроса Анимация ожидания Ajax ответа на кнопках Анимация в OpenGL, а где собсно, анимация? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|