事件——win32 API 例子

转载 2011年01月18日 16:01:00

事件——win32 API 例子 
一、简单例子

HANDLE hEvent;

线程A:  WaitForSingleObject(hEvent,INGINITE);  //在事件上处于等待状态

线程B:   SetEvent(hEvent);                //用于触发一个事件

main:    hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//自动事件,无信号

         handle1 = CreateThread(NULL,0,线程A,NULL,0,&dw1);

         handle2 = CreateThread(NULL,0,线程B,NULL,0,&dw2);

         CloseHandle(handle1);

         CloseHandle(handle2);

         CloseHandle(hEvent);

程序的运行结果是:A一直处于等待状态,直到B把事件触发为有信号状态时,A才能进入并执行动作。

 

二、关于共享缓冲区的例子

HANDLE hWriteEvent;

HANDLE hReadEvent[2];

CRITICAL_SECTION section; //声明一个临界段,因为读事件的输出屏幕共享,所以要进行同步操作

BOOL run=TRUE;

写线程:  hWriteEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//手动事件;无信号

          while(run)

          {

             if(WaitForMultipleObject(2,hReadEvent,TRUE,0)==WAIT_OBJECT_0)//等待两个读事件都有信号

             {

               写入缓冲区;

               PulseEvent(hWriteEvent); //使所有等待该事件的线程运行,当所有线程收到触发信号后,

                                          事件将自动复位为无信号状态,即不等待

             }

          }

读线程1: hReadEvent[0] = CreateEvent(NULL,FALSE,TRUE,NULL);//自动事件;有信号

          while(run)

          {

             WaitForSingleObject(hWriteEvent,INFINITE);  //等待写线程

             EnterCriticalSection(&section);//进入临界区

             把缓冲区的内容读出;

             LeaveCriticalSection(&section);//离开临界区

             SetEvent(hReadEvent[0]); //将事件置为有信号

          }

读线程2:  hReadEvent[1] = CreateEvent(NULL,FALSE,TRUE,NULL);//自动事件;有信号

           while(run)

          {

             WaitForSingleObject(hWriteEvent,INFINITE);  //等待写线程

             EnterCriticalSection(&section);//进入临界区

             把缓冲区的内容读出;

             LeaveCriticalSection(&section);//离开临界区

             SetEvent(hReadEvent[1]); //将事件置为有信号

          }

控制线程: run=FALSE;//让运行停止

main:     InitializeCriticalSection(&section);

          handle1=CreateThread(NULL,0,写线程,NULL,0,&dw1);

          handle2=CreateThread(NULL,0,读线程1,NULL,0,&dw2);

          handle3=CreateThread(NULL,0,读线程2,NULL,0,&dw3);

          Sleep(1000);

          handle4=CreateThread(NULL,0,控制线程,NULL,0,&dw4);//一秒钟后开启控制线程让进程停止

          CloseHandle(handle1);

          CloseHandle(handle2);

          CloseHandle(handle3);

          CloseHandle(handle4);

 

三、小结

1、以上都是对无名事件使用的举例,也就是在一个进程内的线程间。     

2、事件在等待的时候,都是有信号的,在有信号的情况下,不断的试图得到事件的所有权

3、在 WaitForSingleObject 或 WaitForMultipleObject 得到执行之后,事件就变为无信号,即不在等待中。

4、要使用事件,必须先用等待函数去试图得到事件的所有权,得到事件所有权之后就可以进行操作;当操作完之后,要把事件置为有信号状态,把所有权交出。

5、从例2可以明显看出,事件可以同时为多个线程使用。

事件——win32 API 例子

事件——win32 API 例子   一、简单例子 HANDLE hEvent; 线程A:  WaitForSingleObject(hEvent,INGINITE);  //在事件上处于等待状...
  • xringm
  • xringm
  • 2016年03月24日 10:41
  • 1167

Win32APIs 关机程序 (C)

//可以看到C写Win32 APIs Console 程序很方便#include #include #include #pragma hdrstopBOOL SetCurrentPrivilege( ...
  • yuanarea
  • yuanarea
  • 2006年06月18日 08:57
  • 709

Win32 API编程简介Demo程序

Windows编程的方法主要有两种方法,                     传统编写法:利用API函数;                     交互式方法:利用MFC类库。        ...
  • markmin214
  • markmin214
  • 2013年03月29日 11:25
  • 1968

WIN32 API串口通信编程

WIN32 API串口通讯实例教程   第一节实现串口通讯的函数及串口编程简介   API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数...
  • lihongnuo
  • lihongnuo
  • 2016年07月06日 20:24
  • 3185

win32 API的互斥量与信号量

信号量(Semaphore)和互斥量一样,属于内核对象。它自动执行可用资源查询的测试,如果有可用资源,则可用资源的计数减少,从而避免其它线程请求资源。当该线程释放该资源后,可用资源计数增加,则操作系统...
  • dingyaguang117
  • dingyaguang117
  • 2012年01月30日 12:45
  • 3207

有关win32信号量和事件在多线程使用的小例子

#include "windows.h" #include "stdio.h" #include "conio.h" HANDLE g_hEvent = NULL; HANDLE g_hSem = N...
  • yangshuolll
  • yangshuolll
  • 2015年08月12日 16:19
  • 530

Win32控件使用——Button控件

Drecik学习经验分享 转载请注明出处:http://blog.csdn.net/drecik__/article/details/8112652   Button控件是最简单的控件,它一般只...
  • Drecik__
  • Drecik__
  • 2012年10月25日 20:26
  • 1067

win32 dll简单例子

一。显示链接dll编写dllFILE->Visal C++项目: Win32项目->应用程序设置: 选择 DLL(D) 选项 并勾选 导出符号,将 h,cpp文件修改如下:MyDll.h   //My...
  • rem2002
  • rem2002
  • 2007年08月15日 14:27
  • 10589

跟我一起玩Win32开发(12):使用控件——单选按钮

今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少。 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决...
  • tcjiaan
  • tcjiaan
  • 2013年01月31日 17:00
  • 12650

Win32多线程之事件(Event Objects)

Win32中最具弹性的同步机制就属events对象了。Event是一种核心对象,   他的唯一目的就是成为激发状态或者未激发状态。这两种状态完全由程序来控制,   不会成为Wait...()函数的副作...
  • wjj715211
  • wjj715211
  • 2013年11月25日 22:20
  • 947
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:事件——win32 API 例子
举报原因:
原因补充:

(最多只允许输入30个字)