Цитата(ReAl @ Nov 8 2011, 10:05)

Насколько я помню пробежку по описанию USB 2.0, теоретический максимум полезных данных 49 мегабайт в секунду при пакетах в 64 килобайта.
Попробовал разогнать побыстрее.
Решил использовать OVERLAPPED режим.
Объявил буфер и структуры для такого режима:
Код
char *RxBuffer; // указатель на буфер обмена
DWORD dwToRead = OneSector;
DWORD dwRead[SectorNum]; // сколько байт реально считано
OVERLAPPED osRead[SectorNum]; // стуктура для фонового(перекрывающегося) обмена
FT_STATUS overlap_ftStatus[SectorNum];// признак успешности запроса на чтение
Проинициализировал структуры.
Почему то присвоение нуля как в примере не получается. Билдер не дает скомпилировать.
Код
for(int i=0; i< SectorNum;i++)
{
// osRead[i] = { 0 };
osRead[i].hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
}
Открыл файл в OVERLAPPED режиме.
Код
ftHandle = FT_W32_CreateFile(Buf,GENERIC_READ|GENERIC_WRITE,0,0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_OVERLAPPED | FT_OPEN_BY_SERIAL_NUMBER, 0);
Затем начал в цикле ставить в очередь задачи на чтение из USB
Код
for(int i=0; i< SectorNum;i++)
{
overlap_ftStatus[i]=FT_W32_ReadFile(ftHandle, &RxBuffer[i*OneSector], dwToRead, &dwRead[i], &osRead[i]);
Но почему то, очередь затыкалась.
При проверке завершения
Код
ftStatus=FT_W32_GetOverlappedResult(ftHandle, &osRead[i], &dwRead[i], FALSE);
В разных местах. Я было подумал, что слишком много заданий в очереди.
И решил не более 4-х ставить в очередь.
Код
for(int i=0; i< SectorNum;i++)
{
overlap_ftStatus[i]=FT_W32_ReadFile(ftHandle, &RxBuffer[i*OneSector], dwToRead, &dwRead[i], &osRead[i]);
if (i >3)
{
dwRead[i-4] =0;
while (dwRead[i-4]!= dwToRead)
{
ftStatus=FT_W32_GetOverlappedResult(ftHandle, &osRead[i-4], &dwRead[i-4], FALSE);
ftStatus=FT_W32_GetLastError(ftHandle);
}
}
}
Все равно - максимум 58 успешных постановок заданий в очередь.
Как правильно закачать данные?
Архив проект прикладываю.