windows C/C++ 内核对象、事件对象、信号量

承接上一篇:https://blog.youkuaiyun.com/uVarAndMethod/article/details/90360838 

    1、内核对象:														
		进程、线程、文件、文件映射、事件、互斥体等等														
	
    2、事件内核对象的创建															
	HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ");															
	HANDLE g_hMutex = CreateMutex(NULL,FALSE, "XYZ");							
								
	3、事件内核对象的获取															
	HANDLE OpenEvent(							
	  DWORD dwDesiredAccess,  // access							
	  BOOL bInheritHandle,    // inheritance option							
	  LPCTSTR lpName          // object name							
	);															
	HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ");														
	HANDLE g_hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE, "XYZ");							
								
	4、内核对象的销毁														
	BOOL CloseHandle(HANDLE hobj);														
	(1)、当没有其他程序引用时,系统会销毁内核对象(使用数量).														
	(2)、内核对象的生命周期,可能比创建它的对象要长.														
								
	5、内核对象的生命周期														
	eg:CloseHandle()/进程结束														
	进程一:													
	HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ");														
	SetEvent(g_hEvent);							
								
								
	进程二:															
	HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ");														
	WaitForSingleObject(g_hEvent, INFINITE);							
																
	eg:内核对象的生命周期															
	进程一:															
	HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ");															
	SetEvent(g_hEvent);														
								
	进程二:														
	HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ");													
	WaitForSingleObject(g_hEvent, INFINITE);				
///
1、事件对象的创建								
HANDLE CreateEvent(				
  LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 NULL时为系统默认				
  BOOL bManualReset,                       // TRUE 通过调用ResetEvent将事件对象标记为未通知				
  BOOL bInitialState,                      // TRUE 已通知状态  FALSE未通知状态				
  LPCTSTR lpName                           // 对象名称 以NULL结尾的字符串				
);				
								
2、事件对象的控制								
BOOL SetEvent(HANDLE hEvent);				       //将对象设置为已通知				

3、关闭时间对象句柄				
				       //关闭句柄
CloseHandle();				
					
4、线程控制实验:只读形式的线程控制						
HANDLE g_hEvent;				
				
HWND hEdit1;				
HWND hEdit2;				
HWND hEdit3;				
HWND hEdit4;				
HANDLE hThread1;				
HANDLE hThread2;				
HANDLE hThread3;				
HANDLE hThread4;				
				
DWORD WINAPI ThreadProc1(LPVOID lpParameter)				
{				
	//创建事件			
	//默认安全属性  手动设置未通知状态(TRUE)  初始状态未通知 没有名字 			
	g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);			
	HANDLE hThread[3];			
	//创建3个线程			
	hThread[0] = ::CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);			
	hThread[1] = ::CreateThread(NULL, 0, ThreadProc3, NULL, 0, NULL);			
	hThread[2] = ::CreateThread(NULL, 0, ThreadProc4, NULL, 0, NULL);			
				
	//设置文本框的值			
	SetWindowText(hEdit1,"1000");			
				
	//设置事件为已通知			
	SetEvent(g_hEvent);			
				
	//等待线程结束 销毁内核对象			
	WaitForMultipleObjects(3, hThread, TRUE, INFINITE);  			
	CloseHandle(hThread[0]);  			
	CloseHandle(hThread[1]);			
	CloseHandle(hThread[2]);			
	CloseHandle(g_hEvent);  							
	return 0;			
}				
				
DWORD WINAPI ThreadProc2(LPVOID lpParameter)				
{				
	TCHAR szBuffer[10] = {0};							
	//当事件变成已通知时 			
	WaitForSingleObject(g_hEvent, INFINITE);			
				
	//读取内容			
	GetWindowText(hEdit1,szBuffer,10);							
	SetWindowText(hEdit2,szBuffer);							
	return 0;			
}				
DWORD WINAPI ThreadProc3(LPVOID lpParameter)				
{				
	TCHAR szBuffer[10] = {0};							
	//当事件变成已通知时 			
	WaitForSingleObject(g_hEvent, INFINITE);						
	//读取内容			
	GetWindowText(hEdit1,szBuffer,10);						
	SetWindowText(hEdit3,szBuffer);						
	return 0;			
}				
DWORD WINAPI ThreadProc4(LPVOID lpParameter)				
{				
	TCHAR szBuffer[10] = {0};						
	//当事件变成已通知时 			
	WaitForSingleObject(g_hEvent, INFINITE);			
				
	//读取内容			
	GetWindowText(hEdit1,szBuffer,10);			
				
	SetWindowText(hEdit4,szBuffer);							
	return 0;			
}				

	创建信号量					
	HANDLE CreateSemaphore(					
	  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,					
	  LONG lInitialCount,					
	  LONG lMaximumCount,					
	  LPCTSTR lpName					
	);		
			
	函数说明:					
	第一个参数表示安全控制,一般直接传入NULL。					
	第二个参数表示初始资源数量。0时不发送信号 					
	第三个参数表示最大并发数量。lInitialCount<=lMaximumCount					
	第四个参数表示信号量的名称,传入NULL表示匿名信号量。					
			
	打开信号量				
	HANDLE OpenSemaphore(					
	  DWORD dwDesiredAccess,					
	  BOOL bInheritHandle,				
	  LPCTSTR lpName				
	);		
			
	函数说明:					
	第一个参数表示访问权限,对一般传入SEMAPHORE_ALL_ACCESS。详细解释可以查看MSDN文档。				
	第二个参数表示信号量句柄继承性,一般传入FALSE即可。				
	第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个信号量。					
			
	递增信号量的当前资源计数		
						
	BOOL ReleaseSemaphore(					
	  HANDLE hSemaphore,					
	  LONG lReleaseCount,  					
	  LPLONG lpPreviousCount 				
	);					
	函数说明:					
	第一个参数是信号量的句柄。					
	第二个参数表示增加个数,必须大于0且不超过最大资源数量。					
	第三个参数返回当前资源数量的原始值,设为NULL表示不需要传出。					
	注:没有一个函数可以用来查询信标的当前资源数量的值					
			
	信号量的清理与销毁					
	CloseHandle()		
			
	通过信号量控制对资源的访问:				
	见MSDN	

    eg:
    					
	信号量应用								
					
	#include "stdafx.h"				
	#include "resource.h"				
	HANDLE hSemaphore;				
	HANDLE hThread[3];				
	HWND hEditSet;				
	HWND hEdit1;				
	HWND hEdit2;				
	HWND hEdit3;				
	DWORD WINAPI ThreadProc1(LPVOID lpParameter)				
	{				
		TCHAR szBuffer[10];			
		DWORD dwTimmer=0;			
		WaitForSingleObject(hSemaphore, INFINITE);			
		while(dwTimmer<100)			
		{			
			Sleep(100);		
			memset(szBuffer,0,10);		
			GetWindowText(hEdit1,szBuffer,10);		
			sscanf( szBuffer, "%d", &dwTimmer );		
			dwTimmer++;		
			memset(szBuffer,0,10);		
			sprintf(szBuffer,"%d",dwTimmer);		
			SetWindowText(hEdit1,szBuffer);		
		}			
		ReleaseSemaphore(hSemaphore, 1, NULL);			
		return 0;			
	}				
	DWORD WINAPI ThreadProc2(LPVOID lpParameter)				
	{				
		TCHAR szBuffer[10];			
		DWORD dwTimmer=0;			
		WaitForSingleObject(hSemaphore, INFINITE);			
		while(dwTimmer<100)			
		{			
			Sleep(100);		
			memset(szBuffer,0,10);		
			GetWindowText(hEdit2,szBuffer,10);		
			sscanf( szBuffer, "%d", &dwTimmer );		
			dwTimmer++;		
			memset(szBuffer,0,10);		
			sprintf(szBuffer,"%d",dwTimmer);		
			SetWindowText(hEdit2,szBuffer);		
		}			
		ReleaseSemaphore(hSemaphore, 1, NULL);			
		return 0;			
	}				
	DWORD WINAPI ThreadProc3(LPVOID lpParameter)				
	{				
		TCHAR szBuffer[10];			
		DWORD dwTimmer=0;			
		WaitForSingleObject(hSemaphore, INFINITE);			
		while(dwTimmer<100)			
		{			
			Sleep(100);		
			memset(szBuffer,0,10);		
			GetWindowText(hEdit3,szBuffer,10);		
			sscanf( szBuffer, "%d", &dwTimmer );		
			dwTimmer++;		
			memset(szBuffer,0,10);		
			sprintf(szBuffer,"%d",dwTimmer);		
			SetWindowText(hEdit3,szBuffer);		
		}			
		ReleaseSemaphore(hSemaphore, 1, NULL);			
		return 0;			
	}				
	DWORD WINAPI ThreadBegin(LPVOID lpParameter)				
	{				
		TCHAR szBuffer[10];			
		DWORD dwMoney=0;			
					
					
		hSemaphore = CreateSemaphore(NULL,0,3,NULL);			
					
		hThread[0] = ::CreateThread(NULL, 0, ThreadProc1,NULL, 0, NULL);			
		hThread[1] = ::CreateThread(NULL, 0, ThreadProc2,NULL, 0, NULL);			
		hThread[2] = ::CreateThread(NULL, 0, ThreadProc3,NULL, 0, NULL);			
					
		//开始准备红包			
		while(dwMoney<1000)			
		{			
			memset(szBuffer,0,10);		
			GetWindowText(hEditSet,szBuffer,10);		
			sscanf( szBuffer, "%d", &dwMoney );		
			dwMoney++;		
			memset(szBuffer,0,10);		
			sprintf(szBuffer,"%d",dwMoney);		
			SetWindowText(hEditSet,szBuffer);		
		}			
		ReleaseSemaphore(hSemaphore, 2, NULL);			
					
		::WaitForMultipleObjects(3, hThread,TRUE,INFINITE);			
		::CloseHandle(hSemaphore);			
					
		return 0;			
	}				
	BOOL CALLBACK MainDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)				
	{				
		BOOL bRet = FALSE;			
					
		switch(uMsg)			
		{			
		case WM_CLOSE:			
			{		
				EndDialog(hDlg,0);	
				break;	
			}		
		case WM_INITDIALOG:			
			{		
				hEditSet = GetDlgItem(hDlg,IDC_EDIT_SET);	
				hEdit1 = GetDlgItem(hDlg,IDC_EDIT_1);	
				hEdit2 = GetDlgItem(hDlg,IDC_EDIT_2);	
				hEdit3 = GetDlgItem(hDlg,IDC_EDIT_3);	
					
				SetWindowText(hEditSet,"0");	
				SetWindowText(hEdit1,"0");	
				SetWindowText(hEdit2,"0");	
				SetWindowText(hEdit3,"0");	
					
				break;	
			}		
		case WM_COMMAND:			
					
			switch (LOWORD (wParam))		
			{		
			case IDC_BUTTON_BEGIN:		
				{	
					CreateThread(NULL, 0, ThreadBegin,NULL, 0, NULL);
					
					return TRUE;
				}	
			}		
			break ;		
		}			
					
		return bRet;			
	}				
	int APIENTRY WinMain(HINSTANCE hInstance,				
	                     HINSTANCE hPrevInstance,				
	                     LPSTR     lpCmdLine,				
	                     int       nCmdShow)				
	{				
	 	// TODO: Place code here.			
		DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,MainDlgProc);			
		return 0;			
	}				
	

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值