创建事件
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不能写入。