阅读:1432回复:5
请教应用程序的异步处理的问题?
我在应用程序中用ReadFile读USB的数据,传入OVERLAPPED参数,用于异步处理处理,用WaitForSingleObject函数等待,并且设了超时时间,代码如下:
char chData[32]; ::memset(chData,0,32); DWORD nNumber = 0; OVERLAPPED overlp; ::memset(&overlp,0,sizeof(OVERLAPPED)); HANDLE hWait; hWait= ::CreateEvent(NULL,true,false,NULL); overlp.hEvent = hWait; if(ReadFile(m_hFile,chData,32,&nNumber,&overlp) == false) { if(WaitForSingleObject(hWait,100) == WAIT_TIMEOUT) { CancelIo(m_hFile); AfxMessageBox(\"读数据错误\"); } else { if(GetOverlappedResult(m_hFile,&overlp,&nNumber,FALSE)) { //处理..... } } } //--------------------------------------------------------- 在实际运行到ReadFile函数线程却进入休眠状态,为什么呢?是什么原因呢? 驱动程序的Read函数代码是这样的(用DriveStudio做的): NTSTATUS HLUSBProj1Device::Read(KIrp I) { if (FALSE) // If (Request is invalid) { I.Information() = 0; return I.PnpComplete(this, STATUS_INVALID_PARAMETER); } if (I.ReadSize() == 0) { I.Information() = 0; return I.PnpComplete(this, STATUS_SUCCESS); } KMemory Mem(I.Mdl()); ULONG dwTotalSize = I.ReadSize(CURRENT); ULONG dwMaxSize = m_Endpoint2IN.MaximumTransferSize(); if (dwTotalSize > dwMaxSize) { ASSERT(dwMaxSize); dwTotalSize = dwMaxSize; } USB_COMPLETION_INFO* pCompInfo = new (NonPagedPool) USB_COMPLETION_INFO; PURB pUrb = m_Endpoint2IN.BuildBulkTransfer( Mem, dwTotalSize, TRUE, NULL, TRUE ); if (pUrb == NULL) { delete pCompInfo; I.Information() = 0; return I.PnpComplete(this,STATUS_INSUFFICIENT_RESOURCES); } pCompInfo->m_pClass = this; pCompInfo->m_pUrb = pUrb; //设置取消例程 CancelSpinLock::Acquire(); if(I.WasCanceled()) { CancelSpinLock::Release(); delete pUrb; delete pCompInfo; return STATUS_CANCELLED; } I.SetCancelRoutine(LinkTo(Read_Cancel)); CancelSpinLock::Release(); // Submit the URB to our USB device NTSTATUS status; status = m_Endpoint2IN.SubmitUrb(I, pUrb, LinkTo(ReadComplete), pCompInfo, 0); return status; } [编辑 - 12/18/03 by red_orange] [编辑 - 12/18/03 by red_orange] [编辑 - 12/18/03 by red_orange] [编辑 - 12/18/03 by red_orange] |
|
沙发#
发布于:2003-12-18 10:47
大家都没有碰到这中情况吗?或在DDK中呢?
|
|
板凳#
发布于:2003-12-18 10:52
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2003-12-18 10:55
上面的Read函数就是驱动程序的读的例程,我是在DriveStudio中做的,Read_Cancel例程和ReadComplete例程我没写,不过我觉的对此问题不重要。
[编辑 - 12/18/03 by red_orange] |
|
地下室#
发布于:2003-12-18 11:28
各位都不用DriveStudio开发的吗?我看不出代码有什么问题,问题在哪呢?自己顶一下。
|
|
5楼#
发布于:2003-12-18 13:47
我知道了,为了使ReadFile函数支持异步处理,需要将CreateFile函数的第六个参数的FILE_ATTRIBUTE_NORMAL改为FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OVERLAPPED,以便能用异步方式打开。
|
|