CreateEvent()——创建事件函数
/***************************************************************************************************
* 发布⽇期:
* 更新⽇期:2017-11-13 17:05:31
* 进度:
* 作者:Luotian
* 备注:事件
***************************************************************************************************/
事件是⼀个允许⼀个线程在某种情况发⽣时,唤醒另外⼀个线程的同步对象。事件告诉线程何时去执⾏某⼀给定的任务,从⽽使多个线程流平滑
CreateEvent是创建windows事件的意思,作⽤主要⽤在判断线程退出,线程锁定⽅⾯.
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
BOOL bManualReset, // 复位⽅式
BOOL bInitialState, // 初始状态
LPCTSTR lpName //对象名称
);
lpEventAttributes:
[输⼊]⼀个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被⼦进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了⼀个安全符。如果lpEventAttributes是NULL,事件将获得⼀个默认的安全符。
bManualReset:
[输⼊]指定将事件对象创建成⼿动复原还是⾃动复原。
如果是TRUE,那么必须⽤ResetEvent函数来⼿⼯将事件的状态复原到⽆信号状态。
如果设置为FALSE,当事件被⼀个等待线程释放以后,系统将会⾃动将事件状态复原为⽆信号状态。
bInitialState:
[输⼊]指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为⽆信号状态。
lpName:
[输⼊]指定事件的对象的名称,是⼀个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对⼤⼩写敏感的。
如果lpName指定的名字,与⼀个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。
这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。
如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。
如果lpName为NULL,将创建⼀个⽆名的事件对象。
CEvent::SetEvent()把对象设置为有信号状态,释放等待的线程。
CEvent::ResetEvent()把对象设置为⽆信号状态,程序在WaitForSingleObject(hHandle,INFINITE)处等待。
#include <iostream>
#include <afx.h>
#include <process.h>
using namespace std;
HANDLE hUp;
CRITICAL_SECTION g_data;
int arr[10];
HANDLE hEvent; //使⽤⼿动重置为⽆信号状态,初始化时有信号状态
UINT __stdcall Add(LPVOID lParam)
{
DWORD dReturn = WaitForSingleObject(hEvent,INFINITE); //有信号时才能得到
for (int i = 0; i<10;i++ )
{
arr[i]=i;//0-9
}
for (int i = 0;i < 10; i++)
{
cout<<arr[i]<<"";
waitforsingleobject函数}
cout<<endl;
ResetEvent(hEvent);//重置为⽆信号状态
return1;
}
UINT __stdcall Add2(LPVOID lParam)
{
for (int i = 0; i<100 ;i++)
{
arr [i] = i+100;//10`1
}
for (int i = 0;i < 10; i++)
{
cout<<arr[i]<<"";
}
cout<<endl;
SetEvent(hEvent);
//MFC中,CEvent g_event; g_event.SetEvent();
return1;
}
int main()
{
hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
hUp=(HANDLE)_beginthreadex(NULL, 0, Add, NULL, NULL, 0); hUp=(HANDLE)_beginthreadex(NULL, 0, Add2, NULL, NULL, 0); Sleep(5000);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论