事件——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
  • 894

win32应用开发(完全用windows API)开发窗体和处理窗体事件

/* //--------------------------------------------------------------------------- #include #pra...
  • xmsheji
  • xmsheji
  • 2011年01月26日 16:40
  • 1649

利用键盘事件keybd_event(Win32 API)模拟键盘按键

云平台第三次重置后,通过FTP传输文件的途径失效,因此需要其他方法向自己的云桌面发送代码。无论云桌面怎么设置,都必须支持接收键盘和鼠标的输入,因此如果可以模拟键盘输入,就可以实现发送代码的功能。 Wi...

C# Win32API 模拟鼠标移动及点击事件

C# Win32API 模拟鼠标移动及点击事件
  • wyq1153
  • wyq1153
  • 2016年11月03日 21:13
  • 2117

01使用Win32 API创建、销毁线程——控制进度条

1 GetExitCodeThread BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode ); 说明:获取一个已中止线程的...

信号量——win32 API函数

信号量——win32 API函数(2010-05-31 17:31:51)转载标签:信号量api函数win32downit分类:多线程编程一、关于信号量1、在信号量中有一个内置的计数值,用于对资源进行...

多核编程学习笔记之同步(二)——采用Win32 线程API

多核编程学习笔记之同步(二)——采用Win32 线程API分布式2010-04-10 00:25:15阅读44评论0  字号:大中小 订阅I. 总结积累1.1 C/C++调用外部程序描述:运行指定的应...

Win32 SDK基础(6)—— 窗口类的查找过程和相关API

一、窗口类的查找过程     上一文中,我们介绍了windows系统三种窗口类——系统窗口类、全局窗口类和局部窗口类。每种窗口类在操作系统中的作用域不同,而且每个作用域内注册的窗口类名称是不能重复的。...

进程初学——使用win32API创建进程

Windows中使用CreateProcess Function 创建进程
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:事件——win32 API 例子
举报原因:
原因补充:

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