有多次m_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);会导致什么结果?

pass86 2008-01-19 04:23:26
有多次m_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);会导致什么结果?

第一次m_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
创建线程
后我
SetEvent(m_hEvent);

DWORD exitCode;

while (GetExitCodeThread(m_hThread, &exitCode) && exitCode == 0)
{
break;
}

CloseHandle(m_hEvent);
m_hEvent = NULL;


第二次m_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
创建线程
后就阻塞在 WaitForSingleObject(pFtp->m_hEvent, INFINITE);了

调试了半天,没弄明白原因,发现CreateEvent每次返回的值是一样的,难道匿名的都是这个?

CloseHandle(m_hEvent);
m_hEvent = NULL;
没有起作用吗?
...全文
337 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
王者荣耀zhou 2008-01-20
  • 打赏
  • 举报
回复
关键看你的线程是怎么设计的,设计得不好可能会导致死锁
cnzdgs 2008-01-19
  • 打赏
  • 举报
回复
CloseHandle(m_hEvent)就够了。
pass86 2008-01-19
  • 打赏
  • 举报
回复
貌似是 shelliu 说的情况,每次CreateEvent得到的 m_hEvent是一样的,

那怎么才能释放干净 m_hEvent 呢?

CloseHandle(m_hEvent);
m_hEvent = NULL;

还不行么
jameshooo 2008-01-19
  • 打赏
  • 举报
回复
两次创建的事件是不同的事件
shelliu 2008-01-19
  • 打赏
  • 举报
回复
如果是创建命名的事件对象,多次创建后面的创建就会失败,并且返回原来创建的句柄。
shelliu 2008-01-19
  • 打赏
  • 举报
回复
可能是开始创建的没有释放,再次创建的匿名的又创建一样的了吧
cnzdgs 2008-01-19
  • 打赏
  • 举报
回复
与CreateEvent没关系,要看你的线程是怎么写的。
串口通信C程序 //Set CommTimeOuts BOOL SetCommTimeOuts ( VOID ) { //SetComm Input & Output Buffer SetupComm ( hSerial ,MAXLEN * 2 ,MAXLEN * 2 ); //Read TimeOut TimeOuts.ReadIntervalTimeout = MAXDWORD; //Set Total Read TimeOut as MAXDWORD (0xFFFFFFFF) TimeOuts.ReadTotalTimeoutConstant = 0; //Read TimeOut Const TimeOuts.ReadTotalTimeoutMultiplier = 0; //Return Riht now //Write TimeOut TimeOuts.WriteTotalTimeoutMultiplier = 50; //TotalTimeOut = TimeAgr*NumOfChars+const time TimeOuts.WriteTotalTimeoutConstant = 2000; //Set Write TimeOuts return ( FALSE != SetCommTimeouts ( hSerial,&TimeOuts ) ); } //Error MsgBox BOOL ErrMsg ( HWND hWnd,TCHAR *szErr ) { return ( FALSE != MessageBox ( hWnd,szErr,NULL,MB_OK | MB_ICONWARNING ) ); } //Read Comm BOOL ReadCom ( HWND hSet,BYTE InBuff[],INT BytesNum ) { DWORD dwBytesRead = 0; //Record The bytes already read INT iBytesToRead = 0; DWORD dwErrMask = 0; //Clear Memory ZeroMemory ( &ComState ,sizeof(ComState) ); ZeroMemory ( &OvLap ,sizeof(OvLap) ); OvLap.Offset = 0; OvLap.OffsetHigh = 0; OvLap.hEvent = CreateEvent (NULL,TRUE,FALSE,NULL); //Clear All sPort error ClearCommError (hSerial,&dwErrMask,&ComState); //Get The Bytes to read from buff iBytesToRead = min (2000,ComState.cbInQue); if ( 0 == iBytesToRead ) return FALSE; else; if ( FALSE == ReadFile (hSerial,InBuff,iBytesToRead,&dwBytesRead,&OvLap ) ) { if ( GetLastError () == ERROR_IO_PENDING ) { WaitForSingleObject (OvLap.hEvent,2000); PurgeComm (hSerial,PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); } else; } else; return (TRUE); } ///Write Comm BOOL WriteCom ( BYTE *szBuff,DWORD dwBytes ) { DWORD dwErrMask = 0 ; DWORD dwBytesWritten = 0; ZeroMemory ( &OvLap ,sizeof(OvLap) ); ZeroMemory ( &ComState,sizeof(ComState) ); OvLap.Offset = 0; OvLap.OffsetHigh = 0; OvLap.hEvent = CreateEvent (NULL,TRUE,FALSE,NULL); //Clear All sPort error ClearCommError (hSerial,&dwErrMask,&ComState); if ( FALSE == WriteFile ( hSerial,szBuff,dwBytes,&dwBytesWritten ,&OvLap ) ) { if ( GetLastError () == ERROR_IO_PENDING ) { WaitForSingleObject (OvLap.hEvent,2000) ; PurgeComm (hSerial,PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); } else; } else; return ( dwBytesWritten == dwBytes ); } TCHAR* Caps ( TCHAR *szStr ) { UINT i = 0; for ( i = 0 ; szStr[i] != '\0'; i ++ ) { if ( szStr[i] >= 'A' && szStr[i] <= 'Z' ) szStr[i] += 0x20; } return szStr; }

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧