|
51 / 51 / 13
Регистрация: 05.06.2008
Сообщений: 139
|
|
Анимация ожидания17.05.2010, 01:04. Показов 10817. Ответов 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, а где собсно, анимация? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
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
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|