在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);
}
任意顺序运行进程即可,两个进程交替打印,只有运行起来才能看到效果,这里只有运行结果的截图:
以上!