Как реализовать запись на винт непрерывного потока данных
Добавлено: 18 фев 2006, 16:28
Как реализовать запись на винт непрерывного потока данных из внешнего устройства
Подскажите, пожалуйста, как наиболее разумно реализовать следующую задачу:
Есть 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 и перемещении окна проигрывателя звук не искажается, хотя там обработки значительно больше, чем просто принял и сохранил. Может, кто знает, как это реализовано?
Спасибо.
Подскажите, пожалуйста, как наиболее разумно реализовать следующую задачу:
Есть 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 и перемещении окна проигрывателя звук не искажается, хотя там обработки значительно больше, чем просто принял и сохранил. Может, кто знает, как это реализовано?
Спасибо.