vc技术内幕11章的一个例子
UINT ComputerFunc(LPVOID lpParam)
{
volatile int nTemp;
WaitForSingleObject(g_eventStart, INFINITE); for( g_nCount=0; g_nCount<CComputerDlg::m_nMax; ++g_nCount)
{
for( nTemp = 0; nTemp<1000; nTemp++)
{
if( WaitForSingleObject(g_eventKill, 0) == WAIT_OBJECT_0)
break;
}
} PostMessage((HWND)lpParam, WM_FINISH, 0, 0);
g_nCount = 0;
return 0;
}
g_eventKill如果是人工事件,线程运行后,g_eventKill.setEvent后线程立刻停止;
但是如果g_eventKill是自动重置事件,线程运行后,调用g_eventKill.setEvent线程不停止,一直运行;
疑惑:没有其它地方等待g_eventKill,为什么自动重置事件就不行呢?
UINT ComputerFunc(LPVOID lpParam)
{
volatile int nTemp;
WaitForSingleObject(g_eventStart, INFINITE); for( g_nCount=0; g_nCount<CComputerDlg::m_nMax; ++g_nCount)
{
for( nTemp = 0; nTemp<1000; nTemp++)
{
if( WaitForSingleObject(g_eventKill, 0) == WAIT_OBJECT_0)
break;
}
} PostMessage((HWND)lpParam, WM_FINISH, 0, 0);
g_nCount = 0;
return 0;
}
g_eventKill如果是人工事件,线程运行后,g_eventKill.setEvent后线程立刻停止;
但是如果g_eventKill是自动重置事件,线程运行后,调用g_eventKill.setEvent线程不停止,一直运行;
疑惑:没有其它地方等待g_eventKill,为什么自动重置事件就不行呢?
LPSECURITY_ATTRIBUTES lpEventAttributes,
// pointer to security attributes
BOOL bManualReset, // flag for manual-reset event
BOOL bInitialState, // flag for initial state
LPCTSTR lpName // pointer to event-object name
);
bManualReset
Specifies whether a manual-reset or auto-reset event object is created. If TRUE, then you must use the ResetEvent function to manually reset the state to nonsignaled. If FALSE, the system automatically resets the state to nonsignaled after a single waiting thread has been released.
我setevent以后 WaitForSignalObject就应该能等待到该事件,不是吗?
现在的情况是手工事件可以等待到,自动重置的等待不到,然而就这一个地方调用了WaitForSignalObject,那么为什么还是等待不到自动事件?
可以在 WaitForSingleObject 后加个TRACE或断点看是否执行到了
循环目的就是消耗CPU时间 没什么作用
例子就是演示事件的用法主循环用定时器获取g_nCount的值显示在进度条上就3个地方用到g_eventKill:
CEvent g_eventKill;//全局变量
g_eventKill.SetEvent(); //主线程中触发事件
WaitForSingleObject(g_eventKill, 0) //辅助线程中检测事件,事件触发就终止线程
{
HANDLE hEvent = CreateEvent(NULL,
FALSE, //automatically resets
TRUE, //flag for initial state
NULL); WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的初始值是TRUE
SetEvent(hEvent); //设置事件
WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的SetEvent
WaitForSingleObject(hEvent, 2000); //此处会超时退出 CloseHandle(hEvent);
} {
HANDLE hEvent = CreateEvent(NULL,
TRUE, //manual-reset
TRUE, //flag for initial state
NULL);
WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的初始值是TRUE
WaitForSingleObject(hEvent, -1); //此处正常退出,因为需要手动复位
ResetEvent(hEvent); //重置事件
WaitForSingleObject(hEvent, 2000); //此处会超时退出
SetEvent(hEvent);
WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的SetEvent
CloseHandle(hEvent);
}