内核对象——事件

创建事件

HANDLE CreateEventA(
  LPSECURITY_ATTRIBUTES lpEventAttributes,
  BOOL                  bManualReset,
  BOOL                  bInitialState,
  LPCSTR                lpName
);

lpEventAttributes
安全属性 设置为0

bManualReset
如果此参数为真,则该函数将创建一个手动重置事件对象,该对象要求使用ResetEvent函数将事件状态设置为无信号状态。如果此参数为false,则该函数将创建一个自动重置事件对象,并且在释放单个等待线程后,系统会自动将事件状态重置为无信号状态。

bInitialState
如果此参数为真,则表示创建的事件对象为有信号状态;否则为无信号状态

设置事件

BOOL SetEvent(
  HANDLE hEvent
);

该函数将指定的事件对象设置为有信号状态。 有信号表示,等待事件对象的线程变成可调度状态(可以运行)。

重置事件

ResetEvent(  HANDLE hEvent)

该函数将指定的事件对象设置为未通知状态

#include "stdafx.h"
#include <windows.h>

HANDLE g_Event;
DWORD WINAPI ThreadProc1(
	_In_ LPVOID lpParameter
	)
{
	WaitForSingleObject(g_Event,INFINITE);
	printf("线程1运行\n");
	return 0;
}

DWORD WINAPI ThreadProc2(
	_In_ LPVOID lpParameter
	)
{
	WaitForSingleObject(g_Event,INFINITE);
	printf("线程2运行\n");
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	g_Event=CreateEvent(0,1,1,NULL);  
	CreateThread(0,0,ThreadProc1,0,0,0);
	CreateThread(0,0,ThreadProc2,0,0,0);
	getchar();
return 0;
}

在这里插入图片描述

CreateEvent 第二个参数为1 表示需要事件需要手动设置为无信号状态,线程1线程2均未设置,所以两个线程都会运行、

#include "stdafx.h"
#include <windows.h>

HANDLE g_Event;
DWORD WINAPI ThreadProc1(
	_In_ LPVOID lpParameter
	)
{
	WaitForSingleObject(g_Event,INFINITE);
	printf("线程1运行\n");
	return 0;
}

DWORD WINAPI ThreadProc2(
	_In_ LPVOID lpParameter
	)
{
	WaitForSingleObject(g_Event,INFINITE);
	printf("线程2运行\n");
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	g_Event=CreateEvent(0,0,1,NULL);  
	CreateThread(0,0,ThreadProc1,0,0,0);
	CreateThread(0,0,ThreadProc2,0,0,0);
	getchar();
return 0;
}

CreateEvent 第二个参数为0 则系统会自动把事件改变为无信号状态,所以只会运行其中一个线程。
在这里插入图片描述

利用事件对象控制线程运行

在这里插入图片描述
程序要求 当点击开始按钮时 创建两个线程 第一个线程从资源里面输入的字符串中提取一个字符放入 缓冲区中
第二个线程在缓冲区里面读取字符写入接收的buffer里面 。
要求第一个线程在写入缓冲区时,线程2不能读取内容 线程2在读取时 线程1不能写入。

猜你喜欢

转载自blog.csdn.net/qq_41490873/article/details/86770310