INT ReadReportThread(LPVOID pParam)
{
CUsbDlg *pAppDlg;
DWORD Length;
UINT i;
CString Str;
//將引數pParam取出,并轉換為CMyUsbHidTestAppDlg型指標,
//以供下面呼叫其成員函式。
pAppDlg=(CUsbDlg*)pParam;
//該執行緒是個死回圈,直到程式退出時,它才退出
while(1)
{
//設定事件為無效狀態
ResetEvent(ReadOverlapped.hEvent);
//如果設備已經找到
if(MyDevFound==TRUE)
{
if(hReadHandle==INVALID_HANDLE_VALUE) //如果讀句柄無效
{
pAppDlg->AddToInfOut("無效的讀報告句柄,可能是打開設備時失敗");
}
else //否則,句柄有效
{
//則呼叫ReadFile函式請求9位元組的報告資料
int iRet = ReadFile(hReadHandle,
ReadReportBuffer,
512,
NULL,
&ReadOverlapped);
int iLastError= GetLastError();
CString str;
str.Format("%d,%d",iRet,iLastError);
AfxMessageBox(str);
//這里出錯,下面的wait就會一直等待下去,不理解。
}
//等待事件觸發
WaitForSingleObject(ReadOverlapped.hEvent,INFINITE);
//如果等待程序中設備被拔出,也會導致事件觸發,但此時MyDevFound
//被設定為假,因此在這里判斷MyDevFound為假的話就進入下一輪回圈。
if(MyDevFound==FALSE) continue;
//如果設備沒有被拔下,則是ReadFile函式正常操作完成。
//通過GetOverlappedResult函式來獲取實際讀取到的位元組數。
GetOverlappedResult(hReadHandle,&ReadOverlapped,&Length,TRUE);
//如果位元組數不為0,則將讀到的資料顯示到資訊框中
if(Length!=0)
{
pAppDlg->AddToInfOut("讀取報告"+pAppDlg->itos(Length)+"位元組");
Str="";
for(i=0;i<Length;i++)
{
Str+=pAppDlg->itos(ReadReportBuffer[i],16).Right(2)+" ";
}
pAppDlg->AddToInfOut(Str, FALSE);
}
}
else
{
//阻塞執行緒,直到下次事件被觸發
WaitForSingleObject(ReadOverlapped.hEvent,INFINITE);
}
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/113518.html
標籤:C++ 語言
