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
上一篇: matplotlib bar()实现百分比堆积柱状图
下一篇: Spring拦截器