https://www.cnblogs.com/aakuang/p/3514658.html

使用事件CreateEvent注意事项

 
HANDLECreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性
BOOLbManualReset,// 复位方式
BOOLbInitialState,// 初始状态
LPCTSTRlpName // 对象名称
);[1]

参数

lpEventAttributes[输入]

一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。如果lpEventAttributes是NULL,事件将获得一个默认的安全符。
bManualReset[输入]
指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当一个等待线程被释放以后,系统将会自动将事件状态复原为无信号状态。
bInitialState[输入]
指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
lpName[输入]
指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。
如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。
如果lpName为NULL,将创建一个无名的事件对象。
 
 
注意:
1、如果在进程间同步,需要创建具体名称的事件,即参数lpName不能为nil,事件对象的名称一样。
2、手动复原的情况下,先SetEvent发起信号,后面一定要用ResetEvent复原到无信号状态,一一对应。
如果SetEvent后,所有的事件对象都有信号了。当事件的对象被置为有信号状态时,任意数量的等待中线程,以及随后开始等待的线程均会被释放。
var
  FEvent: Cardinal;
 
FEvent := CreateEvent(nil, TRUE, FALSE, 'syn_recansend');//创建时无信号的事件
SetEvent(FEvent);//发起信号
或者
FEvent := CreateEvent(nil, TRUE, True, 'syn_recansend');//创建时无信号的事件
 
//手动复原
procedure TForm1.btn5Click(Sender: TObject);
begin
  if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then  //等于WAIT_OBJECT_0成功返回有信号
  begin
    ReSetEvent(FEvent);//等到信号后置成无信号,以便其他线程等待
    OutputDebugString('写文件等事情,需要同步的代码');
    SetEvent(FEvent);//做完上面的事情后置成有信号的状态,以便其他线程等待到有信号做事情
  end;
end;
  
3、自动复原信号的情况下,SetEvent只会释放当前等待的一个线程;
当一个自动复原的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至一个等待线程被释放;系统将自动将此函数置为无符号状态。如果没有等待线程正在等待,事件对象的状态将保持有信号状态。
var
  FEvent: Cardinal;
 
FEvent := CreateEvent(nil, False, FALSE, 'syn_recansend');//创建时无信号的事件
SetEvent(FEvent);//发起信号
或者
FEvent := CreateEvent(nil, False, True, 'syn_recansend');//创建时无信号的事件
 
//自动复原
procedure TForm1.btn5Click(Sender: TObject);
begin  
  if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then  //等于WAIT_OBJECT_0成功返回信号时,会释自动释放信号 
  begin
    OutputDebugString('写文件等事情,需要同步的代码');
    SetEvent(FEvent);//做完上面的事情后置成有信号的状态,以便其他线程等待到有信号做事情   ;
  end;
//这里不要SetEvent(FEvent);,上面的WaitForSingleObject等待成功时才会自动ResetEvent,所以上面才会有SetEvent。
end;
 
4、最后释放事件
if FEvent <> 0 then
  CloseHandle(FEvent);

使用事件CreateEvent注意事项 多进程同步的方法的更多相关文章

  1. 使用事件CreateEvent注意事项

    HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性 BOOLbManualReset,// 复位方式 BOOLbInit ...

  2. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

    原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing ...

  3. JavaScript自定义事件 - createEvent()、initEvent()和dispachEvent()

    在学习目标事件的方法的时候,接触到了dispatchEvent()方法.度娘查一查,这是一个事件触发器,事件触发器其实就是触发事件的东西. 通常情况下,我们触发事件都是在交互中触发的事件,例如点击按钮 ...

  4. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  5. python类库32[多进程同步Lock+Semaphore+Event]

    python类库32[多进程同步Lock+Semaphore+Event]   同步的方法基本与多线程相同. 1) Lock 当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突. imp ...

  6. Vue.js的列表数据的同步更新方法

    这次给大家带来Vue.js的列表数据的同步更新方法,Vue.js列表数据同步更新方法的注意事项有哪些,下面就是实战案例,一起来看一下. 数组的 push(),pop(),shift(),unshift ...

  7. 使用UEditor 的时候,ajax注意使用同步的方法

    使用UEditor 的时候,ajax注意使用同步的方法去读取后台数据,然后填写到前端的文本域当中.

  8. JAVA中线程同步的方法(7种)汇总

    同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就 ...

  9. iOS网络编程同步GET方法请求编程

    iOS SDK为HTTP请求提供了同步和异步请求两种不同的API,而且可以使用GET或POST等请求方法.我们先了解其中最为简单的同步GET方法请求. 首先实现查询业务,查询业务请求可以在主视图控制器 ...

随机推荐

  1. Spring-data-jpa n+1问题

    Spring-data-jpa的n+1问题 当我们使用JPA提供给我们的find方法时,如果查询出来的对象关联着另外10个对象,那么JPA将会发送1+10次查询(这个对象本身要查询一次,然后每个关联对 ...

  2. linux下 设置php的环境变量 php: command not found

    在自己的根目录进行运行phpinfo();     查看php的根目录. 假如自己查询的目录是/www/wdlinux/apache_php-5.6.21/bin, 查询完成后,先进入linux目录查 ...

  3. linux 生成密钥和公钥,实现免密登录

    1. 在相应的用户根目录下生成密钥公钥,输入如下命令: ssh-keygen -t rsa 2. 直接三次回车:会生成两个文件:id_rsa / id_rsa.pub,分别为密钥和公钥 3.  打开公 ...

  4. iOS自定义键盘的简单实现

    自定义键盘类VolumeInputKeyboardView: VolumeInputKeyboardView.h文件: #import <UIKit/UIKit.h> NS_ASSUME_ ...

  5. jmeter测试文件上传功能

    最近为了完成自动化KPI开始慢慢接触jmeter,其中遇到了不少问题,今天就遇到了文件上传的问题,在这里记录下加深记忆,也可供jmeter初级使用者作为一个参考.另外论坛上已有同事发过关于jmeter ...

  6. vs2017 制作winfrom 安装包!

    https://www.cnblogs.com/GuZhenYin/p/8176981.html 转载 前言 项目中有用到winfrom做配套的打印程序,直接给客户一个debug文件夹,当然不是很好. ...

  7. @ENABLECACHING 基于注解的缓存

    @EnableCaching• @Cacheable指定一个或多个Cache名字,同属性cacheNamesSpring Cache 使用 ---@EnableCaching @Cacheable 注 ...

  8. BZOJ 4373: 算术天才⑨与等差数列 线段树

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  9. sublime Text3中文字体错位问题解决办法

    问题如下: 问题成因: 配置中的默认字体为Consolas,这种字体对中文支持效果不是很好 解决办法: 1.下载 Yahei Consolas Hybrid 字体 2.将下载的Yahei Consol ...

  10. 【技术分享:python 应用之二】解锁用 VSCode 写 python 的正确姿势

    之前一直用 notepad++ 作为编辑器,偶然发现了 VScode 便被它的颜值吸引.用过之后发现它启动快速,插件丰富,下载安装后几乎不用怎么配置就可以直接使用,而且还支持 markdown.当然, ...