Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как реализовать запись на винт непрерывного потока данных


msn777 ©   (2006-02-18 16:27:00) 

Как реализовать запись на винт непрерывного потока данных из внешнего устройства

Подскажите, пожалуйста, как наиболее разумно реализовать следующую задачу:
Есть USB 1.1 устройство, режим Bulk, которое после команды с компа начинает передавать непрерывный поток данных в комп. Скорость передачи информации (ширина потока) ~750 KБ / сек. Оболочка запрашивает данные от драйвера в отдельном потоке блоками по 64 КБ, после чего этот же блок сохраняется в файл. После получения блока устанавливается флажок для основного потока и если предыдущий экран был прорисован то прорисовывается часть данных (2-3%) только что полученного блока (что бы пользователь видел что что-то меняется), если же предыдущий экране не был прорисован, то данные с текущего блока не будут прорисованы, но в любом случае сохраняются в файл. При этом загрузка проца составляет ~20-30 % (Атлон 1700, 512 ОЗУ). Приоритет у потока получения данных TimeCritical, а у оболочки HIGH_PRIORITY_CLASS / THREAD_PRIORITY_TIME_CRITICAL.

Проблема заключается в следующем:
При перемещении или изменении размеров основного окна или просто при нажатии на заголовок окна оболочники происходит довольно ощутимая задержка, что приводит к сбою данных принимаемых в отдельном потоке. Сбой происходит, скорее всего, из-за того, что между запросами к драйверу получается большая пауза ~ 10-20 мс во время манипуляций с основным окном, за эти 10-20 мс USB устройство успевает набить в свое FIFO (5 КБ) 750 * 10-20 = 7500 - 15000 Байт, т.е. происходит переполнение и FIFO и оболочка получает уже всякий бред.
Если же двигать окна любых других программ над оболочкой, запускать тяжелые программы или смотреть фильм, то ни каких глюков нет. Т.е. можно предположить что именно манипуляции с основным окном и приводят чуть ли не к остановке всех потоков приложения?

Подскажите, пожалуйста, как можно сделать, так что бы данные, полученные от устройства всегда были сохранены на винт и следующий запрос происходил максимально быстро, без влияния манипуляций с основным окном? Можно ли как-то запустить чтения данных в другом процессе, например Dll, задача которого просто принять данные и скинуть их на винт?
Например, при прослушивании музыки в WinAmp и перемещении окна проигрывателя звук не искажается, хотя там обработки значительно больше, чем просто принял и сохранил. Может, кто знает, как это реализовано?

Спасибо.


msn777   (2006-02-18 19:42:00) [1]

Спасибо! Теперь и я понял, что в последовательности:
ReadDevData
WriteFile
Запись в файл как раз и могла вносить существенную задержку.


MBo   (2006-02-18 19:08:00) [2]

Ага, не то я написал, что нужно для Bulk.
Принимающий данные поток не должен заниматься записью - только накопить буфер, и сообщить его адрес.


msn777   (2006-02-18 18:40:00) [3]

Спасибо за помощь.

Пробовал и с двумя потоками:
0 (основной) – ничего не делает
1 – принимает данный и сохраняет их в файл
2 – в критической секции (что бы синхронизировать с основным) перерисовывает данные
Не помогает

>А может, и поток 2 не нужен, его работу сделает основной поток...
Сейчас так и есть


MBo   (2006-02-18 16:40:00) [4]

А может, и поток 2 не нужен, его работу сделает основной поток...


MBo   (2006-02-18 16:39:00) [5]

вторичный поток 1 принимает данные, сбрасывает их в файл, затем сообщает вторичному потоку 2, что данные пришли, и указатель на них, и продолжает работу, больше ни на чато не отвлекаясь. Поток 2 спокойненько передает данные форме для отрисовки, и освобождает память этого блока данных.


Наверх

Титульная страница Поиск, карта сайта Написать письмо