对象系统
回调函数类型定义
对象的创建回调函数
typedef T_Result (*TObjectCreate_Func)(void *obj, TTable *in);
功能:创建对象回调处理函数
参数:
参数 | 说明 |
---|---|
obj | 对象 |
in | 封装了创建对象的参数 |
返回值:成功返回T_SUCCESS
对象的销毁回调函数
typedef void (*TObjectDestroy_Func)(void *obj);
功能:销毁对象回调处理函数
参数:
参数 | 说明 |
---|---|
obj | 对象 |
返回值:无
事件注册通知回调函数
typedef void (*TObjectAddEventNotify_Func)(void *obj, T_ID event, Tint if_add);
功能:用户增加或删除了某个事件处理函数
参数:
参数 | 说明 |
---|---|
obj | 对象 |
event | 事件ID |
if_add | 节点不存在时是否新建一个节点 |
返回值:无
事件处理回调函数
typedef void (*TObjectEvent_Func)(void *obj, T_ID event, TTable *in, void *arg, TExist *exist);
功能:事件处理回调函数
参数:
参数 | 说明 |
---|---|
obj | 对象 |
event | 事件ID |
in | 事件相关参数 |
arg | 同函数TObjectAddEventHandler中的参数arg |
exist | 与多线程相关,暂无介绍 |
返回值:无
事件处理回调函数
typedef T_Result (*TObjectMethod_Func)(void *obj, T_ID method, TTable *in_out);
功能:对象方法回调函数
参数:
参数 | 说明 |
---|---|
obj | 对象 |
method | 对象方法 |
in_out | 既是输入参数也存放输出数据 |
返回值:T_Result
对象操作接口
自定义对象类型
T_Result TObjectRegisterType(T_ID type, TObjectType *info);
功能:注册一个自定义对象类型
参数:
参数 | 说明 |
---|---|
type | 自定义对象类型名 |
info | 自定义对象类型的相关信息 |
返回值:操作结果
创建一个对象
void * TObjectCreate(T_ID type, TTable *in);
功能:创建一个对象
参数:
参数 | 说明 |
---|---|
type | 要创建的对象的类型 |
in | 封装了创建对象的参数 |
返回值:返回对象
示例:
/*创建一个控件对象*/
TWidget *w = (TWidget *)TObjectCreate(TStringID(type), tab_in);
销毁一个对象
void TObjectDestroy(void *object);
功能:销毁一个对象
参数:
参数 | 说明 |
---|---|
object | 要销毁的对象 |
返回值: 无
设置对象名称
T_Result TObjectSetName(void *obj, const char *name);
功能:设置对象名称
参数:
参数 | 说明 |
---|---|
obj | 对象 |
name | 要设置的对象名称 |
返回值:T_Result 操作结果
获取对象的名字
const char *TObjectGetName(void *obj);
功能:获取对象的名字
参数:
参数 | 说明 |
---|---|
obj | 对象 |
返回值:对象的名字,若没有则返回NULL。
通过名字查找对象
void *TObjectGetFromName(const char *name);
功能:通过名字查找对象
参数:
参数 | 说明 |
---|---|
name | 对象名字 |
返回值:成功返回该对象,不存在则返回NULL
示例:
/*通过名字查找对象*/
TWidget *bnt_1 = TObjectGetFromName("button_1");
增加对象的引用计数
void TObjectHold(void *object);
功能:增加对象的引用计数
参数:
参数 | 说明 |
---|---|
object | 对象 |
返回值:无
减少对象的引用计数
void TObjectDrop(void *object);
功能:减少对象的引用计数
参数:
参数 | 说明 |
---|---|
object | 对象 |
返回值:无
注册对象的事件
T_Result TObjectAddEventHandler(void *object, T_ID event, TObjectEvent_Func func, void *arg);
功能:注册对象的事件
参数:
参数 | 说明 |
---|---|
object | 对象 |
event | 要注册的事件ID |
func | 事件处理函数 |
arg | 传递到事件处理函数中 |
返回值: 操作结果
示例:
TObjectAddEventHandler(button_1, CLICKED, Clicked_Func func, NULL);
删除对象的注册事件
T_Result TObjectDeleteEventHandler(void *object, T_ID event, TObjectEvent_Func, void *arg);
功能:删除对象的注册事件
参数:
参数 | 说明 |
---|---|
object | 对象 |
event | 要删除的事件ID |
func | 事件处理函数 |
arg | 传递到事件处理函数中 |
返回值:T_Result 操作结果
示例:
TObjectDeleteEventHandler(button_1, CLICKED, Delete_Func, NULL);
串行调用指定对象和事件的所有的事件处理函数
T_Result TObjectEvent(void *object, T_ID event, TTable *in);
功能:串行调用指定对象和事件的所有的事件处理函数
参数:
参数 | 说明 |
---|---|
object | 对象 |
event | 要调用的事件ID |
in | 封装这次事件的参数 |
返回值:操作结果
示例:
TObjectEvent(button_1, CLICKED, NULL);
注解:
该函数可以是对象内部的实现代码在发生事件时调用,触发自身的事件,也可以由用户调用, 模拟触发事件。注意:
同一个对象的相同事件不能重复触发;
不能在触发事件的过程中再次注册相同对象的这个事件。最后可以调用 TObjectDeleteEventHandler()删除注册的事件
获取对象类型
T_ID TObjectGetType(void *object);
功能:获取对象类型
参数:
参数 | 说明 |
---|---|
object | 对象 |
返回值:对象类型
示例:
TObjectGetType(button_1);
检测对象是否存在
Tbool TObjectCheckExist(void *userobj, Tint *ref_count);
功能:检测对象是否存在
参数:
参数 | 说明 |
---|---|
userobj | 要检测的对象 |
ref_count | 可以传NULL |
返回值:TRUE 对象存在 FALSE 对象不存在。
一个通用的函数调用接口
T_Result TObjectCustomMethod(void * userobj, T_ID method, TTable * in_out);
功能:一个通用的函数调用接口
参数:
参数 | 说明 |
---|---|
userobj | 对象 |
method | 对象方法 |
in_out | 既是输入参数也存放输出数据 |
返回值:操作结果
进程间通信
回调函数类型定义
订阅事件处理函数
typedef void (*TMessageRemoteEvent_Func)(void *msg_obj, T_ID event, TTable *in, void *arg, TExist *exist);
参数:
参数 | 说明 |
---|---|
msg_obj | 远程通讯对象 |
event | remote 发布的事件ID |
in | 封装的事件内容 |
arg | 同TMessageRegisterRemoteEvent 的参数 arg |
exist | 与多线程相关,暂不开放 |
返回值:无
远程方法回调函数
typedef T_Result (*TMessageRemoteMethod_Func)(void *msg_obj, T_ID method, TTable *in_out, void *arg);
参数:
参数 | 说明 |
---|---|
msg_obj | 远程通讯对象 |
method | 远程方法ID |
in_out | 既是输入参数也存放输出数据 |
arg | 同TMessageCreate 的参数 arg |
返回值:T_Result 操作结果
服务端执行完客户端请求的远程方法并有结果返回时会自动调用这个函数
typedef void (*TMessageRemoteMethodReturn_Func)(void *msg_obj, T_ID method, TTable *out, void *arg, T_Result ret, TExist *exist);
参数:
参数 | 说明 |
---|---|
msg_obj | 远程通讯对象 |
method | 远程方法ID |
out | 封装的返回结果 |
arg | 同TMessageCreate的参数 arg |
exist | 与多线程相关,暂不开放 |
返回值:无
进程间通信接口
创建一个用于进程间通讯的对象
void *TMessageCreate(const char *name, TMessageRemoteMethod_Func func, void *arg);
功能:创建一个用于进程间通讯的对象
参数:
参数 | 说明 |
---|---|
name | 通讯对象的名字,不得与其他通讯对象名称重复 |
func | 通信对象的回调函数 |
arg | 传递到回调函数func中 |
返回值:无
示例:
void *msg = TMessageCreate("server", Remote_Func, NULL);
在远程事件回调和远程方法执行时得到对方的名字
const char *TMessageGetRemote(void *msg_obj);
功能:在远程事件回调和远程方法执行时得到对方的名字
参数:
参数 | 说明 |
---|---|
msg_obj | 通讯对象 |
返回值: 通讯对象的名字
示例:
void *msg = TMessageCreate("server", Remote_Func, NULL);
char *name = TMessageGetRemote(msg);
在远程事件回调和远程方法执行时得到对方的进程id
Tint TMessageGetCurRemotePid(void *msg_obj);
功能:在远程事件回调和远程方法执行时得到对方的进程id
参数:
参数 | 说明 |
---|---|
msg_obj | 通讯对象 |
返回值: 通讯对象所属的进程ID
示例:
int pid = TMessageGetCurRemotePid(msg_obj);
检查通讯对象是否存在
Tbool TMessageCheckExist(const char *remote);
功能:检查通讯对象是否存在
参数:
参数 | 说明 |
---|---|
remote | 通讯对象的名字 |
返回值:TRUE 通讯对象存在
FALSE 通讯对象不存在
示例:
Tbool if_exist = TMessageCheckExist("server");
获取通讯对象对应的文件描述符
int TMessageGetFd(void *msg_obj);
功能:获取通讯对象对应的文件描述符
参数:
参数 | 说明 |
---|---|
msg_obj | 要操作的通讯对象 |
返回值: 一个整数型文件描述符
示例:
int fd = TMessageGetFd(msg_obj);
主动调用消息处理函数
void TMessageProcess(void *msg_obj);
功能:主动调用消息处理函数
参数:
参数 | 说明 |
---|---|
msg_obj | 传入通讯对象 |
返回值:无
示例:
TMessageProcess(msg_obj);
通讯对象订阅事件
T_Result TMessageRegisterRemoteEvent(void *msg_obj, const char *remote, T_ID event, TMessageRemoteEvent_Func func, void *arg);
功能:通讯对象订阅事件
参数:
参数 | 说明 |
---|---|
msg_obj | 自身的通讯对象 |
remote | 远程通讯对象 |
event | 要订阅的事件ID |
func | 提供的事件处理函数 |
arg | 传递到回调函数func中 |
返回值:操作结果 如果 remote 不存在,那么这次订阅的动作会被缓冲,在 remote 创建后会自动订阅
发布事件(一对多)
void TMessageTriggerRemoteEvent(void *msg_obj, T_ID event, TTable *in);
功能:发布事件(一对多)
参数:
参数 | 说明 |
---|---|
msg_obj | 自身的通讯对象 |
event | 要发布的事件ID |
in | 封装事件的内容 |
返回值:无
示例:
// server.c
void *msg = TMessageCreate("server", NULL, NULL);
TMessageTriggerRemoteEvent(msg, T_STRING_ID(EVENT_LADDR), NULL);
// client.c
void *msg = TMessageCreate("client", NULL, NULL);
TMessageRegisterRemoteEvent(msg, "server", T_STRING_ID(EVENT_LADDR), func, NULL);
删除订阅事件
void TMessageDeleteRemoteEvent(void *msg_obj, const char *remote, T_ID event);
功能:删除订阅事件
参数:
参数 | 说明 |
---|---|
msg_obj | 自身的通讯对象 |
remote | 远程通讯对象 |
返回值:无
示例:
TMessageDeleteRemoteEvent(msg_obj, "server", T_STRING_ID(EVENT_LADDR));
指定通讯对象发布事件(一对一)
void TMessageTriggerRemoteClientEvent(void *msg_obj, const char *remote, T_ID event, TTable *in);
功能:指定通讯对象发布事件(一对一)
参数:
参数 | 说明 |
---|---|
msg_obj | 自身的通讯对象 |
remote | 接收事件的通讯对象名 |
event | 要发布的事件ID |
in | 封装事件的内容 |
返回值:无
示例:
// client.c
void *msg = TMessageCreate("client", NULL, NULL);
TMessageTriggerRemoteClientEvent(msg_obj, "client", T_STRING_ID(EVENT_LADDR), in);
请求远程方法调用
T_Result TMessageRemoteMethod(void *msg_obj, const char *remote, T_ID method, TTable *in,TMessageRemoteMethodReturn_Func func, void *arg);
功能:请求远程方法调用
参数:
参数 | 说明 |
---|---|
msg_obj | 自身的通讯对象 |
remote | 远程通讯对象的名字 |
method | 封装输入参数 |
in | 封装事件的内容 |
func | 提供的结果处理函数 |
arg | 传递到回调函数func中 |
返回值:T_Result 操作结果
示例:
// server.c
void func(void *msg_obj, T_ID method, TTable *in_out, void *arg)
{
if(method == T_STRING_ID(MSG_Remote_Test))
{
}
}
void *msg = TMessageCreate("server",func , NULL);
// client.c
void *msg = TMessageCreate("client", NULL, NULL);
TMessageRemoteMethod(msg,"server",T_STRING_ID(MSG_Remote_Test),send,NULL,NULL);
注解:
如果func 不等于NULL(即有返回值处理函数),那么这次远程方法调用会被缓冲,即使这时 远程的通讯对象不存在或意外退出,在它下次启动时,会自动再次触发这次远程方法调用。如果func 等于NULL,就不被缓冲.有时用户不需要处理返回值,但是又想被缓冲,简单的方法就是提供一个通用的处理函数TRemoteMethodReturn_General_Handler
请求远程方法调用并等待远程方法返回
Tbool TMessageWaitRemoteReturn(void *msg_obj, const char *remote, T_ID method, TTimeout timeout, Tbool ignore);
功能:请求远程方法调用并等待远程方法返回
参数:
参数 | 说明 |
---|---|
msg_obj | 自身的通讯对象 |
remote | 远程通讯对象的名字 |
method | 远程方法ID |
timeout | 超时等待时间 |
ignore | 表示阻塞时间超时是否忽略这次调用:TRUE 忽略;FALSE 不忽略 |
返回值:在阻塞的过程中是否收到返回值
TRUE 在timeout毫秒时间内收到返回值
FALSE 在timeout毫秒时间内未收到返回值
示例:
// client.c
void *msg = TMessageCreate("client", NULL, NULL);
TMessageRemoteMethod(msg,"server",T_STRING_ID(MSG_Remote_Test),send,NULL,NULL);
注解:
timeout为0 表示只检测远程方法是否返回 返回TRUE 表示远程结果已经返回,并且回调函数也已经执行完 返回FALSE 就一定表示结果还没有返回,这时"ignore"才起作用
调用远程方法并等待执行结果
Tbool TMessageRemoteMethodWaitReturn(void *msg_obj, const char *remote, T_ID method,TTable *in_out, T_Result *result, TTimeout timeout_ms);
功能:调用远程方法并等待执行结果
参数:
参数 | 说明 |
---|---|
msg_obj | 自身的通讯对象 |
remote | 远程通讯对象的名字 |
method | 远程方法ID |
in_out | 既是输入参数也存放输出数据 |
result | 远程方法执行的结果 |
timeout_ms | 表示最长阻塞的时间 |
返回值: 函数执行的结果
TRUE 表示收到了远程方法的执行结果
FALSE 表示该操作没有发送出去,或者超时没有收到结果;
示例:
TMessageRemoteMethodWaitReturn(msg_obj, "server", T_STRING_ID(MSG_GET_INIT_STATUS),in_out, &result, 1000);
注解:
只有当函数返回TRUE,并且result为T_SUCCESS时才算成功, 此时in_out 存放返回数据