EventCore 概述
摘要:本文主要讲述EventCore的主要功能,实现原理,和使用方法
本页内容
什么是EventCore
EventCore适用于
EventCore的原理
EventCore的使用方法
EventCore与C++
在C++中使用EventCore
什么是EventCore
EventCore是模拟windows消息机制,实现线程同步、线程通信、进程通信、事件驱动的一个开源项目。
EventCore的最新源代码,可以在http://event.googlecode.com 得到。
EventCore适用于
我们知道Windows窗口是用消息循环来实现事件驱动、窗口间通信、线程同步等功能的。我们在编写多线程无窗口程序(控制台程序,系统服务)时,死锁成为多线程程序的常见bug,线程同步、线程通信成了一个难题,为了解决这些问题,如果在编写多线程无窗口程序(控制台程序,系统服务)时,如果引入Windows消息循环机制,这些难题就迎刃而解了,但是windows只为我们提供了PostThreadMessage这样一个可用于无窗口程序的消息通信函数,因此开发一个与窗口无关,而能实现Windows消息循环机制一样功能的类库是很有必要的,EventCore就是为了这个目的而存在的。
EventCore的原理
EventCore内部有一个全局的线程列队,一个全局的句柄列队,再为需要事件驱动的线程建一个全局的事件列队,为了让所有进程都能共享访问队列,每个队列都是一个windows内存映射文件
EventCore API 函数表
序号 EventCore函数 相似功能的Windows函数
1 CreateEventEx CreateWindow
2 DestroyEvent DestroyWindow
3 GetEvent GetMessage
4 PeekEvent PeekMessage
5 DispatchEvent DispatchMessage
6 ReplyEvent ReplyMessage
7 InSendEvent InSendMessage
8 PostEvent PostMessage
9 SendEvent SendMessage
10 SendEventCallback SendMessageCallback
11 SendEventTimeout SendMessageTimeout
12 SendNotifyEvent SendNotifyMessage
13 PostThreadEvent PostThreadMessage
14 PostQuitEvent PostQuitMessage
15 PostCopyDataEvent PostMessage[WM_CPOYDATA]
16 FindEvent FindWindow
17 EnumEvent EnumWindows
18 GetEventName GetWindowText
19 SetEventName SetWindowText
20 GetEventProc GetWindowLongPtr[GWLP_WNDPROC]
21 SetEventProc SetWindowLongPtr[GWLP_WNDPROC]
22 IsEvent IsWindow
23 FreeThreadQueue
24 GetEventData
25 SetEventData
EventCore的使用方法
Eventcore的使用方法和Windows消息机制几乎一样,请看下面的代码
int CALLBACK EventProc(LPEVENT origEvt)
{
switch(origEvt ->EvtID)
{
case EVT_CREATE:
{
//调用EVT_CreateEvent 时收到的事件
}
break;
case EVT_DESTROY:
{
//调用EVT_DestroyEvent 时收到的事件
}
return 1;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HEVENT hEvent=CreateEventEx(_T(“Test”),EventProc,NULL);
EVT evt;
while(GetEvent(&evt))
{
DispatchEvent(&evt);
}
return evt.wParam;
}
EventCore与C++
EventCore本身就是用C++开发的,开发EventCore的目的,也就是为了解决多线程C++程序通信,数据传递,函数调用,防死锁,线程同步等问题的,因为在C++程序中使用EventCore是非常方便的。
在C++中使用EventCore
class CEventSamples :
public EventCore::CEventAPI<CEventSamples> {
public:
CEventSamples(void)
{
}
CEventSamples(LPCTSTR szclass)
:EventCore::CEventAPI<CEventSamples>(szclass)
{
}
~CEventSamples(void)
{
}
BEGIN_EVT_MAP(CEventSamples)
EVENT_HANDLER(EVT_CREATE,OnCreate)
EVENT_HANDLER(EVT_DESTROY,OnDestroy)
END_EVT_MAP()
public:
LRESULT OnCreate(LPEVT origEvt, BOOL& bHandled)
{
printf("OnCreate ");
return 1;
}
LRESULT OnDestroy(LPEVT origEvt, BOOL& bHandled)
{
printf("OnDestory ");
return 1;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CEventSamples Samples(_T("default"));
::PostEvent(Samples.GetEvent(),EVT_USER+1,1,100);
getchar();
return 0;
}