关于USB,完成端口读取有关问题

关于USB,完成端口读取问题
由于可能有很多同一USB设备同时插入同一电脑中。所以我想使用完成端口来完成USB设备的读取。
但是不知道为什么,工作线程,总是得不到读取数据完成的消息。代码如下?请各位高手指点指点。实在是想不明白。(前提是,我USB设备工作正常,如果我使用单线程,读写都无任何问题)

 DWORD WINAPI CIocpControl::WorkerThread(LPVOID lpParam)
  {

  PGWORKER pWorker=(PGWORKER)lpParam;
  CIocpControl *p_iocp_control=(CIocpControl *)pWorker->pIoControl;
  HANDLE CompletionPort = pWorker->handleCompeltePort;
  DWORD BytesTransferred=-1;
  CUsbBasic *p_usb_handle = NULL;
LPPER_IO_DATA PerIoData = NULL;
  BOOL bRet = FALSE;
  BOOL bl_return=false;


  LPOVERLAPPED lpOverlapped = NULL;

  while (!bl_return)
  {
bRet = GetQueuedCompletionStatus(CIocpControl::ms_HandleCompleteIo,
  &BytesTransferred,
  (LPDWORD)&p_usb_handle,
  (LPOVERLAPPED*)&lpOverlapped,
  INFINITE);
 
  pWorker->dwRunCount++;  
  //如果完成键是空,表示要结束工作线程  

//获得工作项失败
if(bRet == FALSE && lpOverlapped == NULL)
{
TRACE(_T("continue 1\n"));
continue;
}
//无效工作项
if(bRet == FALSE && lpOverlapped != NULL)
{
TRACE(_T("continue 2\n"));
TRACE(_T(""));

PerIoData = (LPPER_IO_DATA)CONTAINING_RECORD(lpOverlapped,
PER_IO_DATA,
  Overlapped);

p_iocp_control->FreeBufferIoData(PerIoData);
// continue;
}
//退出信号到达,退出线程
if(BytesTransferred == -1 && lpOverlapped == NULL)
{
break;
}

 
 
 
   
 
  // 检查成功的返回,这儿要注意使用这个宏CONTAINING_RECORD
  PerIoData = (LPPER_IO_DATA)CONTAINING_RECORD(lpOverlapped,
  PER_IO_DATA,
  Overlapped);
  // 先检查一下,看看是否在错误发生
  if (0 == BytesTransferred)
  {
  p_usb_handle->Close();
  p_iocp_control->FreeBufferIoData(PerIoData);
 
  continue;
  }
  switch (PerIoData->OperationType)
  {
  case IOCP_ADD://添加设备并读取设备
  // usb is contained in OverlapPlus.pusb
  // binding the usb to completion port
  CreateIoCompletionPort(
  (HANDLE)PerIoData->pUsb,
  CIocpControl::ms_HandleCompleteIo,
  0,
  0);
  {
  
   
  PER_IO_DATA *p_add_io=p_iocp_control->GetBufferIoData(PerIoData->pUsb);
//删除添加资源。
delete PerIoData;
PerIoData=NULL;
  //begin the read data to this usb equipment
  ZeroMemory(&(p_add_io->Overlapped), sizeof(OVERLAPPED));
// p_add_io->Overlapped.hEvent=CreateEvent(NULL, TRUE,TRUE,"");; 
  p_add_io->BufferLen =1024;
  p_add_io->OperationType=IOCP_READ;
  memset(p_add_io->DataBuf,0,p_add_io->BufferLen);
  if(!p_usb_handle->ReadUsbData(p_usb_handle,p_add_io))
{

}

  }
  break;
  case IOCP_READ:
  //dear the recieve data 
  p_usb_handle->AddList(PerIoData->DataBuf,PerIoData->BufferLen);
  //reread the data 
  ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
  PerIoData->BufferLen = 1024;
  PerIoData->OperationType=IOCP_READ;
  memset(PerIoData->DataBuf,0,PerIoData->BufferLen);
  p_usb_handle->ReadUsbData(p_usb_handle,PerIoData);