事件EVENT

<span style="font-family: Arial, Helvetica, sans-serif;">/*</span>
常用设置一个全局event,用SetEvent使得句柄有信号,ResetEvent使句柄无信号,线程中用WaitForSingleObject来等待event。

函数原型:
HANDLE CreateEvent(

  LPSECURITY_ATTRIBUTES lpEventAttributes,   // 安全属性,如果lpEventAttributes是NULL,此句柄不能被继承。

  BOOL bManualReset,   // 复位方式如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待
  线程释放以后,系统将会自动将事件状态复原为无信号状态。

  BOOL bInitialState,   // 初始状态,如果为TRUE,初始状态为有信号状态;否则为无信号状态。

  LPCTSTR lpName   // 对象名称,指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。

);

*/
#include "iostream"

#include "windows.h"

using namespace std;

DWORD WINAPI ThreadProc1(LPVOID lpParam);

DWORD WINAPI ThreadProc2(LPVOID lpParam);

HANDLE hEvent = NULL;

HANDLE hThread1 = NULL;

HANDLE hThread2 = NULL;

int main(int argc, char *args[])

{
	hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); //使用手动重置为无信号状态,初始化时有信号状态
	hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc1, NULL, 0, NULL);
	Sleep(200);
	hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc2, NULL, 0, NULL);
	Sleep(200);
	if (NULL == hThread1 || NULL == hThread2)
	{
		cout << "create thread fail!";
	}
		//DWORD dCount = ResumeThread(hThread);
	system("pause");
	return 0;

}

DWORD WINAPI ThreadProc1(LPVOID lpParam)

{
	cout << "in thread1@!" << endl;
	DWORD dReturn = WaitForSingleObject(hEvent, INFINITE);
	if (WAIT_OBJECT_0 == dReturn)
	{
		cout << " thread1 signaled ! " << endl;
	}
	cout << "in thread1 --signal" << endl;
//	ResetEvent(hEvent);
	return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
	cout << "in thread2@!" << endl;
	DWORD dReturn = WaitForSingleObject(hEvent, INFINITE);
	if (WAIT_OBJECT_0 == dReturn)
	{
		cout << "thread2 signaled ! " << endl;
	}

	cout << "in thread2--signal" << endl;
	
	return 0;

}
常用设置一个全局event,用SetEvent使得句柄有信号,ResetEvent使句柄无信号,线程中用WaitForSingleObject来等待event。


函数原型:
HANDLE CreateEvent(


  LPSECURITY_ATTRIBUTES lpEventAttributes,   // 安全属性,如果lpEventAttributes是NULL,此句柄不能被继承。


  BOOL bManualReset,   // 复位方式如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待
  线程释放以后,系统将会自动将事件状态复原为无信号状态。


  BOOL bInitialState,   // 初始状态,如果为TRUE,初始状态为有信号状态;否则为无信号状态。


  LPCTSTR lpName   // 对象名称,指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。


);

你可能感兴趣的:(事件EVENT)