事件也是一个内核对象。
CreatEvent函数
HANDLE CreatEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, //安全属性,一般为NULL,默认。
BOOL bManualReset, //若为FALSE,只要有人wait到,立马自动改为未通知状态。 若 为TRUE,可以通过调用ResetEvent将事件对象标记为未通知。
(手动重置的意思)
BOOL bInitialState, //创建出来的时候的初始状态,TRUE为已通知,FALSE为未通知
LPCTSTR lpName , //名字。)
创建事件:
//默认安全属性,手动设置未通知状态(TRUE),初始状态未通知(FALSE),名字为xyz
HANDLE g_event =CreatEvent(NULL,TRUE,FALSE,"XYZ");
将对象设置为已通知 :
BOOL setEvent(HANDLE hEvent);
关闭句柄:
ClosedHandle();//只是让内核对象计数器-1,并不是关闭内核对象。
VC6课堂代码:
// Read_letter.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include <windows.h>
HWND Hwnd_ExeHwnd;
HWND hEdit1;
HWND hEdit2;
HWND hEdit3;
HWND hEdit4;
HANDLE g_event;
HANDLE hThread_edit[3];
TCHAR szbuffer[10];
DWORD WINAPI next_pro1(LPVOID lpParameter)
{
WaitForSingleObject(g_event,-1);
GetWindowText(hEdit1,szbuffer,10);
SetWindowText(hEdit2,szbuffer);
Sleep(1000);
SetEvent(g_event);
return 0;
}
DWORD WINAPI next_pro2(LPVOID lpParameter)
{
WaitForSingleObject(g_event,-1);
GetWindowText(hEdit1,szbuffer,10);
SetWindowText(hEdit3,szbuffer);
Sleep(1000);
SetEvent(g_event);
return 0;
}
DWORD WINAPI next_pro3(LPVOID lpParameter)
{
WaitForSingleObject(g_event,-1);
GetWindowText(hEdit1,szbuffer,10);
SetWindowText(hEdit4,szbuffer);
Sleep(1000);
SetEvent(g_event);
return 0;
}
DWORD WINAPI Begin_pro(LPVOID lpParameter)
{
g_event=CreateEvent(NULL,FALSE,FALSE,"");
hThread_edit[0]=CreateThread(NULL,0,next_pro1,NULL,0,NULL);
hThread_edit[1]=CreateThread(NULL,0,next_pro2,NULL,0,NULL);
hThread_edit[2]=CreateThread(NULL,0,next_pro3,NULL,0,NULL);
SetWindowText(hEdit1,"1000");
Sleep(1000);
SetEvent(g_event);
WaitForMultipleObjects(3,hThread_edit,TRUE,-1);
CloseHandle( hThread_edit[0]);
CloseHandle( hThread_edit[1]);
CloseHandle( hThread_edit[2]);
CloseHandle(g_event);
return 0;
}
BOOL CALLBACK MAIN_PROC(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
Hwnd_ExeHwnd=hwndDlg;
switch(uMsg)
{
case WM_CLOSE:
EndDialog(hwndDlg,0);
break;
case WM_INITDIALOG :
hEdit1=GetDlgItem(Hwnd_ExeHwnd,IDC_EDIT1);
hEdit2=GetDlgItem(Hwnd_ExeHwnd,IDC_EDIT2);
hEdit3=GetDlgItem(Hwnd_ExeHwnd,IDC_EDIT3);
hEdit4=GetDlgItem(Hwnd_ExeHwnd,IDC_EDIT4);
SetWindowText(hEdit1,"0");
SetWindowText(hEdit2,"0");
SetWindowText(hEdit3,"0");
SetWindowText(hEdit4,"0");
break;
case WM_COMMAND :
switch(LOWORD(wParam))
{
case IDC_BUTTON_START:
HANDLE hThread_Main=CreateThread(NULL,0,Begin_pro,NULL,0,NULL);
break;
}
break;
}
return FALSE ;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,MAIN_PROC);
return 0;
}
效果:
下面三个编辑框挨个读取上面编辑框的内容。 不足的是,它不可以控制先后顺序。