Windows编程之事件对象(2)

在Windows编程之事件对象(1)的基础之上再实现一个例子:

两个进程交替打印0和1,这里用到了另个一API

HANDLE WINAPI OpenEvent(
  __in  DWORD dwDesiredAccess,
  __in  BOOL bInheritHandle,
  __in  LPCTSTR lpName
);

参数

dwDesiredAccess [in]

对事件对象的访问标志。如果指定对象的安全描述符不允许调用进程请求访问,则函数失败。

bInheritHandle [in]

如果该值为 TRUE,则由该进程创建的进程将继承句柄。否则,进程不会继承此句柄。

lpName [in]

要打开的事件的名称。名称比较区分大小写。

返回值

函数执行成功则返回的句柄;失败则返回NULL,获取错误信息可以使用GetLastError

例:两个进程交替打印0和1,分别打印数次,是通过跨进程的事件对象实现的

实现代码如下:

进程1代码:


#include <Windows.h>
#include <stdio.h>

//print0
int main()
{
	//创建跨进程事件对象
	HANDLE hEventPrint0 = CreateEvent(NULL, FALSE, FALSE, L"Print0Event");

	//获取另一个跨进程事件对象
	HANDLE hEventPrint1;
	while ((hEventPrint1 = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"Print1Event")) == NULL)
	{
		wprintf(L"wait for print1Event create\n");
		Sleep(1000);
	}

	for (int i = 0; i < 10; ++i)
	{
		if (WaitForSingleObject(hEventPrint1, INFINITE) == WAIT_OBJECT_0)
		{
			wprintf(L"1\n");
			Sleep(3000);
			SetEvent(hEventPrint0);
		}
	}

	CloseHandle(hEventPrint0);
	CloseHandle(hEventPrint1);
}

进程2代码:


#include <Windows.h>
#include <stdio.h>

//print0
int main()
{
	//创建跨进程事件对象
	HANDLE hEventPrint1 = CreateEvent(NULL, FALSE, FALSE, L"Print1Event");

	//获取另一个跨进程事件对象
	HANDLE hEventPrint0;
	while( (hEventPrint0 = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"Print0Event")) == NULL)
	{
		wprintf(L"wait for print0Event create\n");
		Sleep(1000);
	}
	//先输出0后,置事件对象
	wprintf(L"0\n");
	Sleep(1000);
	SetEvent(hEventPrint1);

	for (int i = 0; i < 10; ++i)
	{
		if (WaitForSingleObject(hEventPrint0, INFINITE) == WAIT_OBJECT_0)
		{
			wprintf(L"0\n");
			Sleep(1000);
			SetEvent(hEventPrint1);
		}
	}

	CloseHandle(hEventPrint0);
	CloseHandle(hEventPrint1);
}

任意顺序运行进程即可,两个进程交替打印,只有运行起来才能看到效果,这里只有运行结果的截图:

 

以上!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇龍_

若帮助到你,希望能给予鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值