реклама на сайте
подробности

 
 
> CyUsb.sys BeginDataXfer() для изохронки, связка BeginDataXfer, WaitForXfer и FinishDataXfer
Igoryok
сообщение Jul 3 2007, 09:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 12-02-07
Пользователь №: 25 265



Доброго дня всем уважаемым форумчанам.
Не могу запустить чтение по изохронки с использованием 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;

}

}

}
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 16:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0135 секунд с 7
ELECTRONIX ©2004-2016