Creative Commons License
本Blog采用 知识共享署名-非商业性使用-禁止演绎 3.0 Unported许可协议 进行许可。 —— Fox <游戏人生>

游戏人生

游戏人生 != ( 人生 == 游戏 )
站点迁移至:http://www.yulefox.com。请订阅本博的朋友将RSS修改为http://feeds.feedburner.com/yulefox
posts - 62, comments - 508, trackbacks - 0, articles - 7

异步回调的一种封装

Posted on 2008-01-23 11:04 Fox 阅读(2306) 评论(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顶部的这个东西:)。
// 注释风格也改成自己平时用的了:)。
//-------------------------------------------------------------------------------

Feedback

# re: 异步回调的一种封装  回复  更多评论   

2008-01-23 11:29 by minidxer
这个实现不错~

# re: 异步回调的一种封装  回复  更多评论   

2008-01-23 12:02 by 万连文
libjingle里面好多,sigslot好像

# re: 异步回调的一种封装  回复  更多评论   

2008-01-23 13:17 by Fox
恩,其实很多都是借鉴os lib里面的思想,放在项目中具体实现以供自己使用的。
因为角色的关系,并没有过多研究这些库的源码。。。不好不好。。。

# re: 异步回调的一种封装  回复  更多评论   

2008-01-23 16:33 by eXile
signal/slot机制正是在C++中解决这种问题比较好的办法,可以看我的办法:
http://www.cppblog.com/eXile/archive/2008/01/09/40782.html

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理