Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
4-1140017275
Stas_Kalishenko
2006-02-15 18:27
2006.05.07
WaitForMultipleObjects


1-1143466199
DelphiLexx
2006-03-27 17:29
2006.05.07
Не работает DoubleBuffered при включенной тема Windows XP


2-1145447723
Volodya_
2006-04-19 15:55
2006.05.07
TWindowsMediaPlayer ActiveX


6-1132997056
MrTime
2005-11-26 12:24
2006.05.07
протокол FTP


3-1142560399
soi
2006-03-17 04:53
2006.05.07
Перехват момента добавления довой записи в DBF файл из внешней пр





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский