Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CyUsb.sys BeginDataXfer() для изохронки
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Igoryok
Доброго дня всем уважаемым форумчанам.
Не могу запустить чтение по изохронки с использованием BeginDataXfer, WaitForXfer и FinishDataXfer. Для примера взял кусок проги из помощи по cyusb.sys и вставил в тестовую программу. Проблема в том что после запуска потока на чтение происходит постоянное выделение памяти в диспетчере задач и в результате комп идет на перезагрузку.
Если у кого есть кусок кода с использованием этой связки выложите сюда плиз. Для ясности вставлю свой (ногами не пинать, опыта программирования на C# немного smile.gif )

Запуск потока:
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[i] = new byte[CyUSB.CyConst.SINGLE_XFER_LEN + EPx.GetPktBlockSize(BufSz)];

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

xferBufs[i] = new byte[BufSz];

ovLaps[i] = new byte[20];

fixed (byte* tmp0 = ovLaps[i])
{

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[i], ref xferBufs[i], ref len, ref ovLaps[i]);
}

i = 0;

for (; true; )
{

fixed (byte* tmp0 = ovLaps[i])
{

OVERLAPPED* ovLapStatus = (OVERLAPPED*)tmp0;

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

EPx.Abort();

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

}

}

if (EPx.FinishDataXfer(ref cmdBufs[i], ref xferBufs[i], ref len, ref ovLaps[i], ref pktInfos[i]))
{

callback();

}

// Re-submit this buffer into the queue

len = BufSz;

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

i++;

if (i == QueueSz)
{

Thread.Sleep(0);
i = 0;

}

}

}
}
torik
Дык это, из примеров посмотри как делают...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.