![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
Alix |
|
|||
![]() L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 1 Всего: 23 |
Упрощу задачу, для более легкого понимания (реально все по-другому). Есть текстовой файл, с записями по одной в строке, вида:
timeshift image где timeshift - время, когда надо отобразить этот image. (не точное, а "после наступления которого"). Программа запускается, запоминает в startTime время запуска (GetTickCount). В дальнейшем в Application.OnIdle вызывается функция, которая берет текущее время currentTime := GetTickCount - startTime, а затем просматривает записи от lastLine (инициализована -1), до той, у которой timeshift не будет > currentTime. По-хорошему, такая запись должна выбраться только одна. Затем рисуется соотвествующая картинка и lastLine меняется на индекс последней обработаной строки. Вроде все хорошо, но есть три минуса: 1. Сильно грузит процессор 2. Не всегда OnIdle вызывается быстро. Не знаю чем обусловлено, но при нетронутом коде заход в OnIdle может происходить раза в 2-3 реже, в результате анимация начинает жутко тормозить. Почему так происходит пока не понял. 3. Часто OnIdle вызывается при уже вызванном OnIdle. Т.е. функция еще работает, а система решает вызвать ее еще раз. Решал с помощью doing : boolean; При заходе if doing then exit else doing := true, при выходе doing := false; Использовать timer - не лучшая идея, т.к. работать с интервалом в 10-15 мс он не способен. Как можно обойти эти недостатки? -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
GetTickCount дает точно такое же разрешение как и таймер. Точнее только мультимедийный таймер и QueryPerformanceCounter -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
OdesitVadim |
|
||||
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 9.11.2007 Где: Одесса:) Репутация: нет Всего: нет |
я бы сделал по простому.
вначале весь файл загружается, сортируется, что бы картинки шли в нужном порядке. и составляется список пар время показа и адрес картинки. теперь запускаем поток, ставим ему приоритет выше среднего. его основной цикл будет выглядеть так.
использование sleep в потоке вполне разумно - поток просто будет засыпать. в основной форме делаем обработку сообщения, где то так
так как поток основное время будет спать, то приоритет можно сделать немного выше - что бы винда не пропускала его обработку. Единственный недостаток этой системы - в целом последовательность может немного разтянуться. (винда не гарантирует, что она точно выдержить все временные промежутки, но недодерживать она не будет, скорее передержит). Но это решить просто - у нас ведь есть поле, которое указывает, в какое время нужно показывать картинку. С помощью GetTickCount вначале запоминаем начальное время, а потом в цикле запрашиваем и корректируем задержку. Но! винда не гарантирует, что выдержит интервалы, которые короче 52 милисекунды. А на серверных вариантах - и все 130 (не уверен в точности числа, но точно чуть больше 100). Поэтому, если у вас будут интервалы меньше 0.1 секунды - то это плохая задумка. В таком случае лучше применить совершенно другие технологии - есть специальные программы, которые с набора картинок могут сделать видеофайл. Может это решит всё проблему? |
||||
|
|||||
Alix |
|
|||
![]() L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 1 Всего: 23 |
я сомневаюсь в надежности данного метода, т.к. неизвестно сколько времени пройдет от посылки сообщения до приема, да и интервалы там поменьше 50мс будут. Впрочем проблему почти решило использование мультимедийного таймера и иная реализация "спец-эффектов".
Что до видеофайла, то у отдельных картинок и качество выше будет и размер суммарный меньше. -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |