当前位置: 移动技术网 > IT编程>开发语言>C/C++ > CreateEvent进程同步

CreateEvent进程同步

2020年04月20日  | 移动技术网IT编程  | 我要评论

会议记录模板,李宗瑞杨偌梅,考研作弊后果

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网