欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

CreateEvent进程同步

程序员文章站 2022-07-09 18:46:30
CreateEvent进程间同步 CreateEvent可以创建或是打开一个命名或是未命名的event对象。 HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes , // pointer to security attributes ......

createevent进程间同步

  createevent可以创建或是打开一个命名或是未命名的event对象。

handle createevent(
  lpsecurity_attributes lpeventattributes, // pointer to security attributes
  bool bmanualreset, // flag for manual-reset event
  bool binitialstate, // flag for initial state
  lpctstr lpname // pointer to event-object name
);

  lpsecurity_attributes结构体用于创建对象的访问控制属性的,为null的话则使用默认的安全描述符,并且对象可被子进程继承。

  bmanualreset参数为true时,被创建对象需要手动调用resetevent函数恢复为__非信号态__(即不可响应);如果为false,event对象在响应等待线程后自动恢复成非信号态。

  binitialstate参数为true时,被创建的对象初始状态为__信号态__(可响应);否则为非信号态。

  lpname参数为event对象名,长度不超过max_path,字符敏感;如果为null,则创建未命名对象。

  现在测试一下如何实现进程间同步。

#include "stdio.h"
#include "windows.h"

int main() {

	handle hevtobj = null;
	dword hret = null;
	char objname[] = { "objtestevt_123" };

	if (hevtobj = createeventa(
		null, 
		true,		// 手动重置为非信号态 
		false,		// 初始不可响应 
		objname)) 
	{
		if (error_already_exists == getlasterror()) { // 事件对象已存在
			printf("event obj \"%s\" has existed ...\n", objname);
			for (int i = 0; i < 10;) {			// 响应10次
				hret = waitforsingleobject(hevtobj, 300);	// 超时时间为0.3秒
				if (!hret) {
					printf("\"%s\" is now signaled %d\n", objname, i++);	// 信号态
				}
				else {
					if (wait_timeout == hret)
						printf("\"%s\" is now nonsignaled\n", objname);		// 非信号态
					else
						printf("wait error %#x...\n", getlasterror());
				}
				sleep(1000);	// 休眠一秒
			}
		}
		else {	// 成功创建事件对象
			printf("create evt obj \"%s\" successful\n", objname);
			sleep(1000);		// 等待同步进程运行
			printf("set event \"%s\" to signaled  for 4 seconds...\n", objname);
			setevent(hevtobj);		// 设置为事件对象为信号态
			sleep(4000);			// 休眠4s
			printf("reset event \"%s\" to nonsignaled for 4 seconds...\n", objname);
			resetevent(hevtobj);	// 设置为非信号态
			sleep(4000);			// 让事件对象处于非信号态4s
			printf("set event \"%s\" to signaled...\n", objname);
			setevent(hevtobj);		//
		}
		closehandle(hevtobj);
		hevtobj = null;
	}
	else {	// 创建失败
		printf("createevent error = %#x", getlasterror());
	}

	return 0;
}

  除了进程间,线程也可使用这种方式。

  参考:createevent