1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > windows C/C++ 内核对象 事件对象 信号量

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

时间:2019-05-11 10:55:26

相关推荐

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

承接上一篇:/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, // accessBOOL bInheritHandle, // inheritance optionLPCTSTR 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);HANDLEhThread[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()通过信号量控制对资源的访问:见MSDNeg:信号量应用#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,LPSTRlpCmdLine,int nCmdShow){// TODO: Place code here.DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,MainDlgProc);return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。