关于WaitForSingleObject 的用法

时间:2022-09-12 13:21:17

OutputDebugString(char* ...)可以在debugview下输出想要的信息,这个在mfc调试时候还是很有用的,不用到处写对话框了

DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds );参数说明:第一个是要关注的对象句柄,如Event,Process等,第二个参数是一个时间间隔,单位是毫秒
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。
先创建一个全局Event对象g_event:CEvent g_event;在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。下面是一个线程函数MyThreadPro()UINT CFlushDlg::MyThreadProc( LPVOID pParam ){WaitForSingleObject(g_event,INFINITE);For(;;){………….}return 0;}在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体UINT CFlushDlg::MyThreadProc( LPVOID pParam ){while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0){………………}return 0;}在这个线程函数中可以通过设置MT_INTERVAL来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了。可以在线程中的函数中使用这个,每隔MT_INTERVAL则执行一次while循环,直到有信号来临(g_event.setEvent()这样会发出信号,)使得这个while循环被终止,程序继续向下执行到线程结束。