关于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);
由于可能有很多同一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);