Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

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

 
msn777   (2006-02-18 16:27) [0]

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

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

Спасибо.


 
MBo ©   (2006-02-18 16:39) [1]

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


 
MBo ©   (2006-02-18 16:40) [2]

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


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

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

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

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


 
MBo ©   (2006-02-18 19:08) [4]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.05.07;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.011 c
2-1145273601
shick
2006-04-17 15:33
2006.05.07
dbgrid и 2 таблицы paradox


8-1134255414
Jrek
2005-12-11 01:56
2006.05.07
stream или channels


2-1145370871
Gelios
2006-04-18 18:34
2006.05.07
Работа со строками


2-1145342719
Женя из Харькова
2006-04-18 10:45
2006.05.07
ПОМОГИТЕ ПОЖАЛУЙСТА!!!


4-1140074783
ExE
2006-02-16 10:26
2006.05.07
запуск приложений и получение результатов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский