Igoryok 0 3 июля, 2007 Опубликовано 3 июля, 2007 · Жалоба Доброго дня всем уважаемым форумчанам. Не могу запустить чтение по изохронки с использованием 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; } } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 6 июля, 2007 Опубликовано 6 июля, 2007 · Жалоба Дык это, из примеров посмотри как делают... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться