会返回WAIT_TIMEOUT。//如果要检测是否停止,那么稍微加点时间。会返回WAIT_OBJECT_0 //1.线程 正常返回. //2.等待一点点时间. //3.WaitForSingleObject只有返回obj,说明成功. //4.那么就关闭handle,并设置handle为null. boolruning=true; HANDLE m_hThreadHandle=NULL; unsigned __stdcall ThreadFunction(LPVOID...
会返回WAIT_TIMEOUT。//如果要检测是否停止,那么稍微加点时间。会返回WAIT_OBJECT_0 //1.线程 正常返回. //2.等待一点点时间. //3.WaitForSingleObject只有返回obj,说明成功. //4.那么就关闭handle,并设置handle为null. boolruning=true; HANDLE m_hThreadHandle=NULL; unsigned __stdcall ThreadFunction(LPVOID...
原来在工作线程中使用了SendMesage,它是阻塞方式发消息,这样的话在主线程中使用了waitforSingleObject,主线程就会被阻塞,要是工作线程也使用了消息循环与主线程相关的操作,那么因为主线程已经被阻塞了,所以子线程得不到相应,那么就出现假死了。 实际上,我们可以不使用WaitForSingleObject,因为MFC主线程在不被关闭的话是不...
1. WaitForSingleObject WaitForSingleObject函数原型为:DWORD WaitForSingleObject(HANDLE hHandle,DWORD hHandle为要监视的对象(一般为同步对象,也可以是线程)的句柄; dwMilliseconds为hHandle对象所设置的超时值,单位为毫秒;有信号就是可以进行下一步,没有信号就是一直等待,等待信号才进行下一步。WaitForSingleObject()就是等...
利用事件(Event)内核对象对线程的通信要复杂些,主要通过对事件对象的监视来实现线程间的通信。事件对象由CreateEvent()函数来创建,具有两种存在状态:置位与复位,分别由SetEvent()和ResetEvent()来产生。事件的置位将通过 WaitForSingleObject()或WaitForMultipleObjects()之类的通知等待函数继续执行。
WaitForSingleObject是在指定的时间内等待这个事件发生,如果发生,返回值就是WAIT_OBJECT_0,你可以理解为在指定的时间内判断ExitHandle是否为真.虽然效果上和BOOL变量类似,但实际上工作原理复杂的多,这涉及到WINDOWS的线程切换及线程同步等相关知识,有兴趣你可以仔细看下相关资料....
WaitForSingleObject,当等待到了一个Event事件,他是触发状态, 他会判断他是不是自动重置事件的,如果是自动重置事件的话, 他会立即调用ResetEvent将这个事件设置成,非触发状态. 这种情况下, 最后可以不掉用这个函数。 因为他在等待函数中,以及调用了这个函数. ...
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"
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟 //当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号 PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); return dwBytesRead; } return 0; }
写也是一样,我们可以用GetOverlappedResult或WaitForSingleObject来等待操作事件完成(记得要初始化OVERLAPPED否则会报错的)。两种方式读写我都做了演示,可以根据自己的需求改造。 读写操作的时候可以获取当前返回值判断是不是ERROR_IO_PENDING来确定是不是有数据还没有读取完成。