red_orange
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2005-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1434回复:5

请教应用程序的异步处理的问题?

楼主#
更多 发布于:2003-12-18 10:31
我在应用程序中用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]
red_orange
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2005-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-18 13:47
我知道了,为了使ReadFile函数支持异步处理,需要将CreateFile函数的第六个参数的FILE_ATTRIBUTE_NORMAL改为FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OVERLAPPED,以便能用异步方式打开。
red_orange
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2005-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-18 11:28
各位都不用DriveStudio开发的吗?我看不出代码有什么问题,问题在哪呢?自己顶一下。
red_orange
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2005-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-18 10:55
上面的Read函数就是驱动程序的读的例程,我是在DriveStudio中做的,Read_Cancel例程和ReadComplete例程我没写,不过我觉的对此问题不重要。

[编辑 -  12/18/03 by  red_orange]
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-18 10:52
用户被禁言,该主题自动屏蔽!
red_orange
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2005-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-18 10:47
大家都没有碰到这中情况吗?或在DDK中呢?
游客

返回顶部