VC 调用WaitforSingleObject报错.该怎么处理
VC 调用WaitforSingleObject报错...
创建 全局变量
//接收报告用的OVERLAPPED。
OVERLAPPED ReadOverlapped;
在初始化函数中
//创建一个事件,提供给ReadFile使用,当ReadFile完成时,
//会设置该事件为触发状态。
ReadOverlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
//创建一个读报告的线程,挂起状态
pReadReportThread = AfxBeginThread(ReadReportThread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
//如果创建成功,则恢复该线程的运行
if (pReadReportThread!=NULL)
{
pReadReportThread->ResumeThread();
}
在线程中
UINT CMainMonitor::ReadReportThread(LPVOID lp)
{
while(1)
{
//设置事件为无效状态
ResetEvent(cdlg->ReadOverlapped.hEvent);
if
{
....
}
else
//等待事情触发
WaitForSingleObject(cdlg->ReadOverlapped.hEvent,INFINITE);
到这一步 就报错
直接跳到
BOOL AFXAPI AfxPumpMessage()
{
CWinThread *pThread = AfxGetThread();
if( pThread )
return pThread->PumpMessage();
else
return AfxInternalPumpMessage();
}
这....0xC0000005: Access violation reading location 0x00000064.
是什么原因呢?
------解决方案--------------------
------解决方案--------------------
cdlg有问题!
------解决方案--------------------
参考:
创建 全局变量
//接收报告用的OVERLAPPED。
OVERLAPPED ReadOverlapped;
在初始化函数中
//创建一个事件,提供给ReadFile使用,当ReadFile完成时,
//会设置该事件为触发状态。
ReadOverlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
//创建一个读报告的线程,挂起状态
pReadReportThread = AfxBeginThread(ReadReportThread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
//如果创建成功,则恢复该线程的运行
if (pReadReportThread!=NULL)
{
pReadReportThread->ResumeThread();
}
在线程中
UINT CMainMonitor::ReadReportThread(LPVOID lp)
{
while(1)
{
//设置事件为无效状态
ResetEvent(cdlg->ReadOverlapped.hEvent);
if
{
....
}
else
//等待事情触发
WaitForSingleObject(cdlg->ReadOverlapped.hEvent,INFINITE);
到这一步 就报错
直接跳到
BOOL AFXAPI AfxPumpMessage()
{
CWinThread *pThread = AfxGetThread();
if( pThread )
return pThread->PumpMessage();
else
return AfxInternalPumpMessage();
}
这....0xC0000005: Access violation reading location 0x00000064.
是什么原因呢?
------解决方案--------------------
------解决方案--------------------
cdlg有问题!
------解决方案--------------------
参考:
- C/C++ code
/////////////////////////////////////////////////////// int CUload::ReadCommBlock(BYTE *pBlock,int nBlockLen) { //return 0 if error int WaitErr; BOOL fReadStart; COMSTAT ComStat; DWORD dwErrorFlags,dwLength; if (!m_bConnected) return 0; if (ClearCommError(m_idComDev,&dwErrorFlags,&ComStat)) { //ComStat filled if (dwErrorFlags) { if (dwErrorFlags & CE_RXOVER) AfxMessageBox("Receive Queue overflow"); else if(dwErrorFlags & CE_OVERRUN) AfxMessageBox("Receive Overrun Error"); else if(dwErrorFlags & CE_RXPARITY) AfxMessageBox("Receive Parity Error"); else if(dwErrorFlags & CE_FRAME ) AfxMessageBox("Receive Framing error"); else if(dwErrorFlags & CE_BREAK) AfxMessageBox("Break Detected"); else AfxMessageBox("CE_OTHERS"); } } // nBlockLen may >,=,< ComStat.cbInQue ! dwLength=min((DWORD)nBlockLen,ComStat.cbInQue); if(dwLength>0) { // read required fReadStart=ReadFile(m_idComDev,pBlock,dwLength,&dwLength,&m_osRead); if(!fReadStart) { // if there was a problem, or the async. operation's still pending ... if(GetLastError()==ERROR_IO_PENDING) { // asynchronous i/o is still in progress if (WaitErr=WaitForSingleObject(m_osRead.hEvent,60000))// 1 minute { // time over if(WaitErr==WAIT_TIMEOUT) { // time out dwLength=0; AfxMessageBox("Time out !"); }// end time out }// end waiterr } // end io_pending else { // WaitErr=0.if you SetEvent(m_osRead.hEvent) anywhere else GetOverlappedResult(m_idComDev,&m_osRead,&dwLength,FALSE); m_osRead.Offset +=dwLength; } } } //end if dwLength>0 return dwLength; } // an work thread to monitor the _CTS and RX_CHAR UINT CUload::CommWatchRead(LPVOID lpParam) { // return 0=OK 1=Error CUload *pUload=(CUload*)lpParam; OVERLAPPED os; DWORD dwEventMask,dwTransfer; memset(&os,0,sizeof(OVERLAPPED)); os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);// attrb,Manual,init,name if (os.hEvent==NULL) { AfxMessageBox("Can't create Event",MB_ICONSTOP); return 1;// error } // set 2 events ! if (!SetCommMask(pUload->m_idComDev,EV_RXCHAR|EV_CTS)) return 1; while (pUload->m_bConnected) { // break,only if m_bConnected=NULL dwEventMask=0; if(!WaitCommEvent(pUload->m_idComDev,&dwEventMask,&os)) { // function fails if (GetLastError()==ERROR_IO_PENDING) {// TRUE=WaitForSingleObject() should be called inside GetOverlappedResult(pUload->m_idComDev,&os,&dwTransfer,TRUE); os.Offset+=dwTransfer; } } if((dwEventMask & EV_RXCHAR)==EV_RXCHAR) { // some chats received. ResetEvent(pUload->m_hPostEventRead);// first reset pUload->PostMessage(WM_COMMNOTIFY, (WPARAM)1, // EV_RXCHAR (LPARAM)0); // not used // wait answer WaitForSingleObject(pUload->m_hPostEventRead,0xFFFFFFFF); } // if not at same time,use else if if((dwEventMask & EV_CTS)==EV_CTS) { // CTS changed ResetEvent(pUload->m_hPostEventRead);// first reset pUload->PostMessage(WM_COMMNOTIFY, (WPARAM)0, // EV_CTS (LPARAM)0); // not used // wait answer WaitForSingleObject(pUload->m_hPostEventRead,0xFFFFFFFF); } } CloseHandle(os.hEvent); return 0;// OK }