Windows事件内核对象

来源:互联网 发布:js修改div的style 编辑:程序博客网 时间:2024/05/20 11:27

事件触发表示一个操作已经完成。

事件对象的两种类型:

手动重置事件:当一个手动重置事件被触发的时候,正在等待该事件的所有线程都将变成可调度状态。

自动重置事件:当一个自动重置事件被触发的时候,只有一个正在等待该事件的线程编程可调度状态,如果存在

多个线程等待此事件的话,唤醒线程是随机的(Microsoft官方回答)。

事件对象的创建函数:

HANDLE CreateEvent(

PSECURITY_ATTRIBUTES psa,

BOOL bManualReset,

BOOL bInitialState,

PCTSTR pszName);//事件的名称,如果为NULL,就为匿名事件

bManualReset:如果为TRUE表示创建一个手动重置事件,如果为FALSE表示自动重置事件。

bInitialState:表示将事件初始化为触发状态(TRUE),为触发状态(FALSE)。

当成功创建事件之后,返回的事件句柄与当前进程相关联。

//创建事件内核对象的扩展函数

HANDLE CreateEventEx(

PSECURITY_ATTRIBUTES psa,

PCTSTR pszName,

DWORD dwFlags,

DWORD dwDsireAccess);

//其他进程中的线程可以通过打开一个已经存在的事件

HANDLE OpenEvent

DWORD dwDesiredAccess,

BOOL bInherit,

PCTSTR pszName);

//将事件变成触发状态

BOOL SetEvent( HANDLE hEvent);

//将事件变成未触发状态

BOOL ResetEvent(HANDLE hEvent);//当线程成功等到自动重置事件对象的时候,事件会自动地重置为未触发状态。

此时不需要调用ResetEvent,这是因为系统会自动将事件重置。

eg:

HANDLE g_hEvent ;

DWORD WINAPI WordCount(PVOID pvParam)

{

WaitForSingleObject(g_hEvent,INFINITE);

//Access the memory block;

.....

ResetEvent(g_hEvent);

return 0 ;

}

DWORD WINAPI SpellCheck(PVOID pvParam)

{

WaitForSingleObject(g_hEvent,INFINITE);

//Access the memory block;

.....

ResetEvent(g_hEvent);

return 0 ;

}

DWORD WINAPI GrammarCheck(PVOID pvParam)

{

WaitForSingleObject(g_hEvent,INFINITE);

//Access the memory block;

.....

ResetEvent(g_hEvent);

return 0 ;

}

int main()

{

//创建手动重置事件

g_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

HANDLE hThread[3] ;

hThread[0] = _beginThreadex(NULL,0,WordCount,NULL,0,NULL);

hThread[1] = _beginThreadex(NULL,0,SpellCheck,NULL,0,NULL);

hThread[2] = _beginThreadex(NULL,0,GrammarChech,NULL,0,NULL);

//触发事件,则三个线程都会变成可调度状态

SetEvent(g_hEvent); 

System("pause");

return 0;

}

如果创建的事件为自动重置事件,那么我们需要在每个子线程运行完毕之前,调用SetEvent(g_hEvent),以便让其他线程运行。

我们应该在不需要事件内核对象的时候调用CloseHandle函数来将它关闭。

0 0
原创粉丝点击