c 中createevent函数详解及实例-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 2580515
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

(877)

  • (1)
  • (0)
  • (1)
  • (0)
  • (325)
  • (7)
  • (84)
  • (5)
  • (6)
  • (5)
  • (3)
  • (7)
  • (8)
  • (6)
  • (13)
  • (12)
  • (41)
  • (20)
  • (41)
  • (12)
  • (40)
  • (121)
  • (14)
  • (6)
  • (18)
  • (4)
  • (17)
  • (2)
  • (15)
  • (5)
  • (32)
  • (6)
  • (0)
文章存档

(2)

(20)

(471)

(358)

(26)

我的朋友
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: windows

2015-05-27 17:04:24

c 中createevent函数详解及实例

handle createevent(
  • lpsecurity_attributes lpeventattributes,
    bool bmanualreset,
    bool binitialstate,
    lpcstr lpname
    );
    bmanualreset:true,使用resetevent()手动重置为无信号状态;false,当一个等待线程被释放时,自动重置状态为无信号状态。

    binitialstate:指定事件对象的初始状态,当true,初始状态为有信号状态;当false,初始状态为无信号状态。


    下面主要演示一下采用createevent实现多线程。

    例子很简单,主要测试createevent中bmanualreset:和binitialstate参数的取值在线程调用中信号状态的情况。


    测试1:

    bmanualreset:true
    binitialstate:true


    createevent(null, true, true, null); //使用手动重置为无信号状态,初始化时有信号状态


    example.cpp

     


    执行结果:

     


    从结果中看,执行完线程1又执行了线程2.

    由于hevent = createevent(null, true, true, null),使用手动重置为无信号状态,初始化时有信号状态

    所以hevent一直处于有信号状态,无论是线程1释放后,hevent仍处于有信号状态,所以线程2正常执行了。

    测试2:

    bmanualreset:false
    binitialstate:true

     hevent = createevent(null, false, true, null); //当一个等待线程被释放时,自动重置为无信号状态,初始是有信号状态

     

    example2.cpp

     


    执行结果:

     

    从执行结果中分析,执行了线程1,线程2一直在等待,直到主线程结束。

    由于hevent = createevent(null, false, true, null),当一个等待线程被释放时,自动重置为无信号状态,初始是有信号状态

    初始执行线程1的时候,hevent是有信号的,所以线程1正常执行;又由于bmanualreset=false,所以执行完线程1后,hevent自动重置为无信号状态,所以在线程2中,


    waitforsingleobject(hevent,infinite); 
    waitforsingleobject(hevent,infinite);函数一直在等待hevent变为有信号状态,但是当主线程执行完,还没等待到,线程2程序一直没有走下去。


    测试3:

    bmanualreset:true
    binitialstate:false


    hevent = createevent(null, true, false, null);//使用手动重置为无信号状态,初始化时为无信号状态

    example3.cpp

     

    01.#include "iostream"
    02.#include "windows.h"
    03.using namespace std;
    04. 
    05.dword winapi threadproc1(lpvoid lpparam);
    06.dword winapi threadproc2(lpvoid lpparam);
    07.handle hevent = null;
    08.handle hthread1 = null;
    09.handle hthread2 = null;
    10.int main(int argc, char *args[])
    11.{
    12.//hevent = createevent(null, true, true, null); //使用手动重置为无信号状态,初始化时有信号状态
    13.//hevent = createevent(null, false, true, null); //当一个等待线程被释放时,自动重置为无信号状态,初始是有信号状态
    14.hevent = createevent(null, true, false, null);//使用手动重置为无信号状态,初始化时为无信号状态
    15.//if (setevent(hevent))
    16.//{
    17.//  cout << "setevent 成功" <
    18.//}
    19.hthread1 = createthread(null, 0, (lpthread_start_routine)threadproc1, null, 0,null);
    20.sleep(200);
    21.hthread2 = createthread(null, 0, (lpthread_start_routine)threadproc2, null, 0,null);
    22.sleep(200);
    23.if ( null == hthread1)
    24.{
    25.cout <<"create thread fail!";
    26.}
    27.//dword dcount = resumethread(hthread);
    28.//cout << loword(dcount) << endl;
    29.return 0;
    30.}
    31.dword winapi threadproc1(lpvoid lpparam)
    32.{
    33.cout <<"in thread1@!"<
    34. 
    35.dword dreturn = waitforsingleobject(hevent,infinite);
    36. 
    37.if ( wait_object_0 == dreturn)
    38.{
    39.cout <<" thread1 signaled ! "<
    40.}
    41.cout <<"in thread1 --signal"<
    42. 
    43.//setevent(hevent);
    44.return 0;
    45.}
    46.dword winapi threadproc2(lpvoid lpparam)
    47.{
    48.cout <<"in thread2@!"<
    49. 
    50.dword dreturn = waitforsingleobject(hevent,infinite);
    51. 
    52.if ( wait_object_0 == dreturn)
    53.{
    54.cout <<"thread2 signaled ! "<
    55.}
    56.cout <<"in thread2--signal"<
    57. 
    58.return 0;
    59.}

    执行结果,可想而知,只能输出:


    in thread1@! 
    in thread1@![cpp] view plaincopyprint?in thread2@! 
    in thread2@!因为初始为无信号状态,所以hevent一直处于无信号状态,因此这两个线程一直在等待,直到主线程结束。

    修改:放开例子中的注释部分:

    if (setevent(hevent))//设置信号为有信号状态
    {
    cout << "setevent 成功" < }


    执行结果:

     

    可见,线程1和线程2都执行了。

    因为调用setevent,事件变为有信号状态,线程1执行;又由于线程1释放后,hevent仍旧处于有信号状态,所以线程2也执行了。

    再修改:在线程1中,添加resetevent(hevent)(手动设置事件为无信号状态),则线程2不会执行。

    测试4:

    bmanualreset:false
    binitialstate:false


    hevent = createevent(null, false, false, null);//线程释放后自动重置为无信号状态,初始化时为无信号状态

    example4.cpp



    执行结果:

     

    由于调用setevent,hevent为有信号状态,线程1正常执行,又由于调用完线程1后,hevent自动重置为无信号状态,所以线程2只能在等待,直到主线程退出。

    修改:线程1中的setevent(hevent);的注释去掉,再运行,则线程1和线程2 都会执行。

阅读(1619) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图