【多线程】(六)触发一个事件脉冲PulseEvent

参考 http://blog.csdn.net/morewindows/article/details/7445233

 

第五个PulseEvent

函数功能:将事件触发后立即将事件设置为未触发,相当于触发一个事件脉冲。

函数原型:BOOLPulseEvent(HANDLEhEvent);

函数说明:这是一个不常用的事件函数,此函数相当于SetEvent()后立即调用ResetEvent();此时情况可以分为两种:

1.对于手动置位事件,所有正处于等待状态下线程都变成可调度状态。

2.对于自动置位事件,所有正处于等待状态下线程只有一个变成可调度状态。

此后事件是末触发的。该函数不稳定,因为无法预知在调用PulseEvent ()时哪些线程正处于等待状态

 

       下面对这个触发一个事件脉冲PulseEvent ()写一个例子,主线程启动7个子线程,其中有5个线程Sleep(10)后对一事件调用等待函数(称为快线程),另有2个线程Sleep(100)后也对该事件调用等待函数(称为慢线程)。主线程启动所有子线程后再Sleep(50)保证有5个快线程都正处于等待状态中。此时若主线程触发一个事件脉冲,那么对于手动置位事件,这5个线程都将顺利执行下去。对于自动置位事件,这5个线程中会有中一个顺利执行下去。而不论手动置位事件还是自动置位事件,那2个慢线程由于Sleep(100)所以会错过事件脉冲,因此慢线程都会进入等待状态而无法顺利执行下去。

 

#include "stdafx.h"
#include "process.h"
#include "windows.h"

HANDLE g_hThreadEvent;
//快线程
unsigned int __stdcall FastThreadFun(void *pPM)
{
	Sleep(10); 
	printf("%s 启动\n",(PSTR)pPM);
	WaitForSingleObject(g_hThreadEvent,INFINITE);
	printf("%s 等到事件被触发 顺利结束\n",(PSTR)pPM);
	return 0;
}

//慢线程
unsigned int __stdcall SlowThreadFun(void *pPM)
{
	Sleep(100); 
	printf("%s 启动\n",(PSTR)pPM);
	WaitForSingleObject(g_hThreadEvent,INFINITE);
	printf("%s 等到事件被触发 顺利结束\n",(PSTR)pPM);
	return 0;
}

int main()
{
	printf("  使用PluseEvent()函数\n");
	BOOL bManualReset = TRUE;
	//创建事件,第二个参数手动置位TRUE,自动置位FALSE
	g_hThreadEvent = CreateEvent(NULL ,bManualReset ,FALSE ,NULL);
	if (bManualReset == TRUE)
		printf("当前使用手动置位事件\n");
	else
		printf("当前使用自动置位事件\n");

	char szFastThreadName[5][20] = {"快线程1000","快线程1001","快线程1002","快线程1003","快线程1004"};
	char szSlowThreadName[2][30] = {"慢线程196","慢线程197"};

	int i;
	for (i=0;i<5;i++)
	{
		_beginthreadex(NULL,0,FastThreadFun,szFastThreadName[i],0,NULL);
	}
	for (i=0;i<2;i++)
	{
		_beginthreadex(NULL,0,SlowThreadFun,szSlowThreadName[i],0,NULL);
	}

	Sleep(50);
	printf("现在主线程触发一个事件脉冲 - PulseEvent()\n");
	PulseEvent(g_hThreadEvent);

	Sleep(3000);
	printf("时间到,主线程结束运行\n");
	CloseHandle(g_hThreadEvent);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值