阅读:2945回复:13
如何取消一个pending的bulk read?(已解决)
我开启一个(readthread)线程在一个端点上读数,由于这个时候端点上没有数据,因此线程停在readpipe上。这时我在主线程调用URB_FUNCTION_ABORT_PIPE,希望能够使readthread跳过readpipe向下执行,应该没有问题吧。但是我的主线程又停在URB_FUNCTION_ABORT_PIPE上了!
在ddk help 中写道: URB_FUNCTION_ABORT_PIPE is a general-purpose request that enables a client to cancel any pending transfers for the specified pipe. URB_FUNCTION_RESET_PIPE is a general-purpose request that enables a client to clear the stalled state of a pipe within the USB stack. Transfers will resume with the next URB queued for the endpoint. 问题: 1、为什么ABORT_PIPE会失败呢?(RESET_PIPE 也不行) 2、应该怎样解决? 3、URB_FUNCTION_RESET_PIPE 能用吗? 谢谢! [编辑 - 11/10/03 by mmcall] [编辑 - 11/11/03 by mmcall] |
|
最新喜欢:![]() |
沙发#
发布于:2004-11-18 17:06
问题解决方法2:(有兴趣可以尝试)
在应用程序中也可以解决该问题。如果驱动中没有处理超时问题的话。 在应用程序中想终止一个BULK读写操作,需要重新对该设备创建一个新句柄,使用新的设备句柄发送终止管道的命令即可以解决该问题。完成后别忘了释放句柄! :) |
|
|
板凳#
发布于:2004-11-18 10:13
谢谢这里的哥们,解决了我的大问题。
看来这里的确是个好地方。我会常来交流的! |
|
地板#
发布于:2003-11-13 13:23
也许我的设备(在有的PC上跑死)也是这个问题,我去试试,顺便顶一下。
|
|
|
地下室#
发布于:2003-11-11 17:24
ding
|
|
5楼#
发布于:2003-11-11 16:03
不错!
|
|
6楼#
发布于:2003-11-11 15:00
恭喜!我也学到了! :)
|
|
|
7楼#
发布于:2003-11-11 14:21
终于搞定!
超时判断+cancel irp CallUSBD() { …… KeInitializeEvent(&event, NotificationEvent, FALSE); irp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_USB_SUBMIT_URB, pdx->StackDeviceObject, NULL, 0, NULL, 0, TRUE, /* INTERNAL */ &event &ioStatus); ntStatus = IoCallDriver(pdx->StackDeviceObject,irp); if (ntStatus == STATUS_PENDING) { LARGE_INTEGER timeout; timeout.QuadPart = -1000000*2; //200 ms status = KeWaitForSingleObject (&event,Suspended, KernelMode,FALSE,&timeout); if (status == STATUS_TIMEOUT) { IoCancelIrp(irp); ntStatus = STATUS_UNSUCCESSFUL; KeWaitForSingleObject (&event,Suspended, KernelMode,FALSE,NULL); } else ntStatus = STATUS_SUCCESS; } else { ioStatus.Status = ntStatus; } …… } |
|
8楼#
发布于:2003-11-10 14:07
to kilroy_guo:
我就是用的ezusb,也试过abort all pipes,都不行啊。 |
|
9楼#
发布于:2003-11-10 13:44
ezusb代码里面有abort pipe的函数,你看看它的用法:
它的函数Ezusb_HandleRemoveDevice里面就是这样做的,abort all pipes。你用过不行么? |
|
|
10楼#
发布于:2003-11-10 13:18
确实是bulk。
是否可以用IoCancelIrp(irp)? 但是如何在一个Irp中找到read的那个irp呢? |
|
11楼#
发布于:2003-11-10 12:29
明白你的意思,你的情况是读请求送下去了,设备方还没给你返回数据,没有回应。iso传输不会这样,你说的应该是bulk传输,我就不清楚bulk了,我认为可能韧件部分要针对没有数据的情况做特殊处理了,比如返回一堆\"ff\"给你。也许bulk有其他方式可以终止正在进行的传输,你要请教他人了
|
|
|
12楼#
发布于:2003-11-10 10:48
to kilroy_guo:
谢谢你! 问题是我线程中已经停在readpipe上。 而且我不愿意主线程强制TerminateThread() 所以正象你所说置一个变量,让线程(readthread)自己ExitThread()。 我该怎么办呢? |
|
13楼#
发布于:2003-11-10 10:38
为什么要abort?
你可以置一个变量,给你的线程来判断是否跳过往下走 主线程想要终止线程的时候,设置那个变量,然后再abort或者reset |
|
|