CreateEvent相关

1、HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes, 
  BOOL bManualReset, 
  BOOL bInitialState, 
  LPTSTR lpName 
); 创建新的事件对象,返回其句柄
lpEventAttributes: 构造体SECURITY_ATTRIBUTES的指针,表示新创建的事件对象的安全属性。如果为NULL时表示为默认安全属性。
bManualReset:创建的事件对象是否为人工重置还是自动重置,true为人工重置;false为自动重置。
bInitialState: true为事件对象的初始化为有信号状态,false为事件对象初始化为无信号状态。
lpName: 事件对象的名称,如为NULL则是匿名事件。

2、BOOL SetEvent(HANDLE hEvent); 将一个事件对象设为有信号状态。

hEvent: 需要进行设置的事件对象的句柄。

3、BOOL ResetEvent(HANDLE hEvent); 讲一个事件对象设为无信号状态。

hEvent: 需要进行设置的事件对象的句柄。

4、DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);等待具体事件的发生,即事件对象转为有信号状态

hHandle:所等待的事件对象的句柄

dwMilliseconds:等待时间长短,值为时INFINITE为永久等待。

 1 #include <cstdio>
 2 #include <windows.h>
 3 
 4 using namespace std;
 5 
 6 DWORD WINAPI myfun1(LPVOID lpParameter);
 7 DWORD WINAPI myfun2(LPVOID lpParameter);
 8 
 9 HANDLE hevent;
10 int a = 0;
11 
12 int main()
13 {
14     hevent = ::CreateEvent(NULL, FALSE, true, NULL);
15     HANDLE h1, h2;
16     h1 = ::CreateThread(NULL, 0, myfun1, NULL, 0, NULL);
17     printf("线程1开始运行!!\n");
18     h2 = ::CreateThread(NULL, 0, myfun2, NULL, 0, NULL);
19     printf("线程2开始运行!!\n");
20     ::Sleep(1000);
21     ::CloseHandle(h1);
22     ::CloseHandle(h2);
23     return 0;
24 }
25 
26 DWORD WINAPI myfun1(LPVOID lpParameter)
27 {
28     while(1)
29     {
30         ::WaitForSingleObject(hevent, INFINITE);
31         ::ResetEvent(hevent);
32         ++a;
33         printf("线程1正在运行:%d\n", a);
34         ::SetEvent(hevent);
35         ::Sleep(100);
36     }
37     return 0;
38 }
39 
40 DWORD WINAPI myfun2(LPVOID lpParameter)
41 {
42     while(1)
43     {
44         ::WaitForSingleObject(hevent, INFINITE);
45         ::ResetEvent(hevent);
46         ++a;
47         printf("线程2正在运行:%d\n", a);
48         ::SetEvent(hevent);
49         ::Sleep(100);
50     }
51     return 0;
52 }

转载于:https://www.cnblogs.com/myweblog/archive/2012/05/29/2524602.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CreateEvent函数是Windows API提供的一个函数,用于创建一个事件对象。这个事件对象可以用来在多个线程之间进行同步操作。在创建事件对象时,可以指定事件的初始状态,可以是有信号(signaled)状态或无信号(nonsignaled)状态。 WaitForSingleObject函数也是Windows API提供的一个函数,用于等待一个对象的信号状态。在等待过程中,该函数会使当前线程进入等待状态,直到对象的信号状态发生变化。 当我们使用CreateEvent函数创建一个事件对象,然后在某个线程中调用WaitForSingleObject函数来等待该事件对象的信号状态变化时,就可以实现线程的同步操作。 在具体的应用场景中,我们可以使用CreateEvent函数创建一个事件对象,并将其设为无信号状态。然后在需要进行同步操作的多个线程中调用WaitForSingleObject函数,使线程进入等待状态。当某个线程完成了特定的任务后,可以调用SetEvent函数将事件对象的信号状态设置为有信号状态,从而唤醒其他等待该事件对象的线程。其他线程被唤醒后,可以继续执行后续的操作,实现线程的同步。 总之,CreateEvent函数和WaitForSingleObject函数是Windows API提供的两个用于线程同步的函数。通过创建事件对象并等待其信号状态的变化,可以实现多个线程之间的同步操作。 ### 回答2: CreateEvent函数的作用是创建一个用于同步或异步等待的事件对象。它返回一个用于标识事件对象的句柄。而WaitForSingleObject函数则用于等待事件对象的有信号状态。 首先,CreateEvent函数是用来创建事件对象的,我们可以根据需要指定事件的类型。当调用CreateEvent函数时,可以传入两个参数,第一个参数是一个BOOL类型的指示参数,用于确定事件对象是自动重置还是手动重置。当设置为自动重置时,当一个线程等待事件对象后,其他等待线程也会被激活;而当设置为手动重置时,必须手动调用ResetEvent函数来重置事件对象,才能启用下一个等待线程。第二个参数是一个BOOL类型的指示参数,用于确定事件对象的初始状态是有信号状态还是无信号状态。 而WaitForSingleObject函数用于等待事件对象的有信号状态。当调用WaitForSingleObject函数时,我们需要传入两个参数,第一个参数是一个事件对象的句柄,用于确定等待哪个事件对象的信号状态。第二个参数是一个等待时间,用于确定等待事件对象的时间,单位为毫秒。当事件对象的信号状态被触发时,WaitForSingleObject函数会返回WAIT_OBJECT_0,表示成功等待事件对象;如果等待超时,函数会返回WAIT_TIMEOUT,表示超时等待;其他情况下,函数会返回一个错误码,表示等待失败。 综上所述,CreateEvent函数用于创建一个用于同步或异步等待的事件对象,而WaitForSingleObject函数则用于等待这个事件对象的信号状态。它们可以一起使用,实现线程之间的同步或异步操作。 ### 回答3: CreateEvent函数是Windows操作系统提供的一个系统调用函数,用于创建一个事件对象,并返回其句柄。事件对象是一种同步基元,用于在线程之间同步和通信。同时,一个事件对象还可以用于线程间的互斥和信号通知。 WaitForSingleObject函数是Windows操作系统提供的另一个系统调用函数,用于等待一个或多个内核对象的信号状态。在这里,我们讨论的是等待单个事件对象的信号状态。该函数会阻塞当前线程,直到所等待的事件对象被信号量激发或超时。 具体来说,当我们创建一个事件对象并设置了其初始状态为非激发状态时,我们可以使用CreateEvent函数创建该事件对象,并获得其句柄。然后,我们可以使用WaitForSingleObject函数来等待事件对象的激发信号。当事件对象被激发后,WaitForSingleObject函数将返回等待状态,线程可以继续执行后续操作。 该组合方式的应用场景很多。比如,当需要在两个或多个线程之间进行同步时,我们可以使用CreateEvent函数创建一个事件对象,并将其传递给需要同步的线程。等待的线程可以使用WaitForSingleObject函数来等待事件对象的激发信号,从而实现同步。当其他线程激发该事件对象时,等待的线程将会被唤醒继续执行。 总之,CreateEvent和WaitForSingleObject是Windows操作系统提供的两个与事件对象相关的函数,用于创建事件对象和等待事件对象的激发信号。这种组合方式可以实现线程间的同步和通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值