Posted on 2008-01-23 11:04
Fox 阅读(2413)
评论(4) 编辑 收藏 引用 所属分类:
G游戏编程
Author: Fox
前段时间写过一篇关于线程安全的文字,有TX觉得不深入。因为本来就没想写的太具体,只是随便说说,今天就想说点具体的技术。
//-------------------------------------------------------------------------------
// 动态链接库 (Dynamic Link Library)
1) 动态链接;
2) 跨语言;
3) Win32平台可用;
1 //
静态链接库.h文件中对函数的声明:
2 // dllExam.h
3 extern "C" void /*__stdcall*/ Func( int
nParam );
4
5 //
动态链接库.h文件中对函数的声明:
6 // dllExam.h
7 extern "C" void __declspec( dllexport ) /*__stdcall*/ Func( int
nParam );
8
9 // 动态链接库的静态调用:
10 #pragma comment(lib,"dllExam.lib"
)
11 extern "C" __declspec(dllimport) /*__stdcall*/ Func( int
nParam );
12
13 dllFun(0
);
14
15 //
动态链接库的动态调用:
16 // useDllExam.cpp
17 typedef void(/*__stdcall*/ *CallFun )( int ); // 宏定义,方便使用
18
19 HINSTANCE hDll; // DLL句柄
20 CallFun dllFun; // 库函数指针
21 hDll = LoadLibrary( "dllExam.dll"
);
22 if
( hDll )
23
{
24 dllFun = (CallFun)GetProcAddress(hDll, "Func"
);
25 if
( dllFun )
26
{
27 dllFun(0
);
28
}
29
FreeLibrary(hDll);
30 }
动态链接库的一般应用都在这儿了,更加具体的就要去问google了:)。
//-------------------------------------------------------------------------------
// 异步回调 ( Asynchronism Callback )
今天想说的主要内容是异步回调。大致结构是:
//-------------------------------------------------------------------------------
// IAsyncCaller IAsyncCallback
// \ /
// CManager --> CSession --> CEvent
//-------------------------------------------------------------------------------
// class : CManager
// function : Singleton实现,管理所有CSession对象
// class : CSession
// function : 处理会话,关联事务
// class : CEvent
// function : Session的关联对象,处理异步回调
// base class: IAsyncCaller, IAsyncCallback
在发起session的时候,new一个CSession对象,为其分配一个GUID,并加入管理session的CManager对象的map(支持多线程操作),new一个CEvent对象,将该CEvent对象设置为回调响应的host,该CEvent对象可进行其他同步处理。
当回调条件满足,由CManager通过相应CSession对象触发,并交由其关联的CEvent对象处理。
如果CEvent应用规模较小,可由CManager的map直接管理,省掉CSession的中间处理。
这种处理方式的优点是,将普通事务的回调处理机制抽象为通过Session Manager(CManager)进行统一管理,普通事务的处理放到main thread中,线程间通信则交给CManager和CSession,实现了良好封装。
//-------------------------------------------------------------------------------
// 具体实现这里就不给出了,用到的TX根据上面的描述应该大概知道怎么做了。其他TX如果不清楚的话,
// 清楚的话,可以先google其中的一些关键词。动态链接库的部分因为内容很少,因此也只提供基础使用。
//
// PS: 因为GF学知识产权的,刚好了解到有这样一个“创作共用”协议,而且最近很多人在讨论
// cppblog的原创精神问题,于是大家就看到我blog顶部的这个东西:)。
// 注释风格也改成自己平时用的了:)。
//-------------------------------------------------------------------------------