Перейти к содержанию
    

CyUsb.sys BeginDataXfer() для изохронки

Доброго дня всем уважаемым форумчанам.

Не могу запустить чтение по изохронки с использованием BeginDataXfer, WaitForXfer и FinishDataXfer. Для примера взял кусок проги из помощи по cyusb.sys и вставил в тестовую программу. Проблема в том что после запуска потока на чтение происходит постоянное выделение памяти в диспетчере задач и в результате комп идет на перезагрузку.

Если у кого есть кусок кода с использованием этой связки выложите сюда плиз. Для ясности вставлю свой (ногами не пинать, опыта программирования на C# немного :) )

 

Запуск потока:

ThreadClass.CallbackMethod x = new ThreadClass.CallbackMethod(ResultCallback);

ThreadClass ThreadIso = new ThreadClass("IsoThread", ref myDev, ref EP2, x );

Thread IsoThread = new Thread(new ThreadStart(ThreadIso.ListenThread));

IsoThread.Start();

 

class ThreadClass

{

string ThreadName;

CyUSB.CyUSBDevice myDevx;

CyUSB.CyIsocEndPoint EPx;

private CallbackMethod callback;

public delegate void CallbackMethod();

 

internal struct OVERLAPPED

{

public int Internal;

public int InternalHigh;

public uint Offset;

public uint OffsetHigh;

public uint hEvent;

}

 

public ThreadClass(string name, ref CyUSB.CyUSBDevice myDevxx, ref CyUSB.CyIsocEndPoint EPxx, CallbackMethod callbackDelegate)

{

ThreadName = name;

myDevx = myDevxx;

EPx = EPxx;

callback = callbackDelegate;

 

}

public unsafe void ListenThread()

{

 

if (myDevx == null)

{

return;

}

 

byte i = 0;

 

int BufSz = (int)(EPx.MaxPktSize * 80U);

 

int QueueSz = 8; //Количество буферов для чтения изохронного канал

 

EPx.XferSize = BufSz;

 

// Setup the queue buffers

 

byte[][] cmdBufs = new byte[QueueSz][];

 

byte[][] xferBufs = new byte[QueueSz][];

 

byte[][] ovLaps = new byte[QueueSz][];

 

CyUSB.ISO_PKT_INFO[][] pktInfos = new CyUSB.ISO_PKT_INFO[QueueSz][];

 

for (i = 0; i < QueueSz; i++)

{

 

cmdBufs = new byte[CyUSB.CyConst.SINGLE_XFER_LEN + EPx.GetPktBlockSize(BufSz)];

 

pktInfos = new CyUSB.ISO_PKT_INFO[EPx.GetPktCount(BufSz)];

 

xferBufs = new byte[bufSz];

 

ovLaps = new byte[20];

 

fixed (byte* tmp0 = ovLaps)

{

 

OVERLAPPED* ovLapStatus = (OVERLAPPED*)tmp0;

 

ovLapStatus->hEvent = (uint) CyUSB.PInvoke.CreateEvent(0, 0, 0, 0);

 

}

 

}

 

// Pre-load the queue with requests

//Запускаем 8 очередей на чтение данных с изохронного эндпоинта

 

int len = BufSz;

 

for (i = 0; i < QueueSz; i++)

{

EPx.BeginDataXfer(ref cmdBufs, ref xferBufs, ref len, ref ovLaps);

}

 

i = 0;

 

for (; true; )

{

 

fixed (byte* tmp0 = ovLaps)

{

 

OVERLAPPED* ovLapStatus = (OVERLAPPED*)tmp0;

 

if (!EPx.WaitForXfer(ovLapStatus->hEvent, 500))

{

 

EPx.Abort();

 

CyUSB.PInvoke.WaitForSingleObject(ovLapStatus->hEvent, 500);

 

}

 

}

 

if (EPx.FinishDataXfer(ref cmdBufs, ref xferBufs, ref len, ref ovLaps, ref pktInfos))

{

 

callback();

 

}

 

// Re-submit this buffer into the queue

 

len = BufSz;

 

EPx.BeginDataXfer(ref cmdBufs, ref xferBufs, ref len, ref ovLaps);

 

i++;

 

if (i == QueueSz)

{

 

Thread.Sleep(0);

i = 0;

 

}

 

}

 

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...