Nebula2探秘10-Signal System

2024-01-18 02:08
文章标签 system signal 探秘 nebula2

本文主要是介绍Nebula2探秘10-Signal System,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Nebula2探秘10-Signal System

happykevins文     

使用Nebula2信号系统的目的:

  Nebula2的信号系统主要功能是对象间的消息传递。
  由于消息的发出者和接收者是在运行时动态邦定的,所以用这种方式传递消息并不会增加程序的耦合度。
  另外Nebula2还提供了一个SignalServer用于实现延时消息。

Nebula2信号系统主要包含以下几个类:
  nSignal:
   继承自nCmdProto类,用于标识一个信号,并描述信号回调函数的原形
  nSignalRegistry:
   包含多个nSignal的集合;nClass继承自此类;因此可以推测出信号是与类
   邦定的,要使Nebula类型支持产生信号,我们首先要向该类注册信号
  nSignalBinding:
   封装了信号接收者及其回调函数,用于向信号发出者注册
  nSignalBindingSet:
   包含多个nSignalBinding的集合
  nSignalEmitter:
   信号发生器,nObject继承自此类;因此所有的Nebula对象都支持发出信号
   的功能,前提是你注册了信号
  nSignalServer:
   这其实是独立于信号系统的一个附加功能,主要是实现了相应延时信号

Nebula2信号系统的使用方法:

  Nebula2的信号系统支持Native代码和脚本两种途径的传递,下面简单介绍通过脚本途径的使用。
  首先需要实现一个用于产生信号的Emtter类,Emitter就是一个普通的继承自nObject的Nebula2类型,只是在初始化命令的函数中添加了信号(nSignal)。
  然后我们需要实现一个Receiver类,Receiver类也是一个继承自nObject的普通Nebula2脚本类,可以将Receiver的脚本指令向Emitter中感兴趣的信号注册,这样在Emitter产生信号时就会向注册的Receiver广播消息了;需要注意的是在Receiver向Emitter注册时需要保证Receiver的回调函数与Emitter的信号的函数原形保持一致。

 Nebula2引擎的Bug:
  需要改正一个Nebula2的Bug,在nargs.h的第276行加上代码:
   this->type = Type::String;
  原来的代码由于缺少这句话,在nArgs从va_list复制String类型参数时会丢失类型信息,所以在信号传递过程中如果使用String类型参数的话Nebula2就会出错。

 下面是Emitter的代码:

/* ************************************************************************** */
/*     Nebula2 - Tutorial 10                                                     */
/*   Nebula2 Signal System                                                     */
/*   author: happykevins                                                         */
/* ************************************************************************** */

///  Emitter.h
#pragma  once
#include 
" kernel/nroot.h "
#include 
" signals/nsignal.h "

class  Emitter :  public  nRoot
{
    
///  @note
    
///  为了支持信号系统,在类的实现中不需要添加任何代码
    
///  只需在Emitter对应的nClass中注册信号即可
    
///  注册信号的工作一般在初始化脚本指令的函数(n_initcmds)中完成
};

///  Emitter.cpp
#include  " Emitter.h "
#include 
" kernel/nkernelserver.h "
#include 
" ../NebulaUtils/nutildefs.h "

nNebulaScriptModule(Emitter, emitter, 
" nroot " );

void  nNebulaScriptInitCmds(emitter)(nClass *  cls)
{
    
///  在这里添加信号
    
///  注册信号始需要指出信号对应回调函数的原形以及信号的ID
    cls -> BeginSignals( 1 );
    cls
-> AddSignal( " v_sig1_s " ' SIG1 ' );
    cls
-> EndSignals();
}

下面是Receiver的代码:

/* ************************************************************************** */
/*     Nebula2 - Tutorial 10                                                     */
/*   Nebula2 Signal System                                                     */
/*   author: happykevins                                                         */
/* ************************************************************************** */

///  Receiver.h
#pragma  once
#include 
" kernel/nroot.h "

class  Receiver:  public  nRoot
{
public :
    
void  Print( const   char *  str)
    {
        n_printf(
" %s " , str);
    }
};

///  Receiver.cpp
#include  " Receiver.h "
#include 
" kernel/nkernelserver.h "
#include 
" ../NebulaUtils/nutildefs.h "

nNebulaScriptModule(Receiver, receiver, 
" nroot " );

static   void  n_print( void *  o, nCmd *  cmd);

void  nNebulaScriptInitCmds(receiver)(nClass *  cl)
{
    
///  为Emitter的回调添加脚本函数
    
///  信号系统也是通过脚本函数来传递消息
    
///  脚本函数的需要与Emitter对应的信号保持一致
    cl -> BeginCmds();
    cl
-> AddCmd( " v_print_s " ' PRNT ' , n_print);
    cl
-> EndCmds();
}

static   void  n_print( void *  o, nCmd *  cmd)
{
    Receiver
*  slf  =  (Receiver * )o;
    slf
-> Print(cmd -> In() -> GetS());
}

下面是使用信号系统的范例代码:

/* ************************************************************************** */
/*     Nebula2 - Tutorial 10                                                     */
/*   Nebula2 Signal System                                                     */
/*   author: happykevins                                                         */
/* ************************************************************************** */

/// ----------------------------------------------------------------------------
///  +必要头文件

//  nebula2 includes
#include  " kernel/nkernelserver.h "
#include 
" kernel/ntimeserver.h "
#include 
" signals/nsignalserver.h "
#include 
" ../NebulaUtils/nutildefs.h "

#include 
" Emitter.h "
#include 
" Receiver.h "

///  -必要头文件
/// ----------------------------------------------------------------------------



/// ----------------------------------------------------------------------------
///  +声明使用的Nebula2 Package&Module
nNebulaUseModule(emitter);
nNebulaUseModule(receiver);
///  -声明使用的Nebula2 Package&Module
/// ----------------------------------------------------------------------------

/// ----------------------------------------------------------------------------
///  +Application
int  main( int  argc,  const   char **  argv)
{
    
///  创建KernelServer
    nKernelServer *  ks  =  n_new(nKernelServer);

    nNebulaAddModule(emitter);
    nNebulaAddModule(receiver);

    
///  创建SignalServer
    nSignalServer *  signals  =  (nSignalServer * )ks -> New( " nsignalserver " " /sys/servers/signals " );

    
///  创建信号发生器
    Emitter *  emit  =  (Emitter * )ks -> New( " emitter " " /usr/signals/emitter " );
    
///  创建信号接收器
    Receiver *  rec  =  (Receiver * )ks -> New( " receiver " " /usr/signals/receiver " );

    
///  将信号接收器邦定到信号发生器指定的信号
    emit -> BindSignal( ' SIG1 ' , rec,  ' PRNT ' 0 true );

    
///  发出立即信号
    emit -> EmitSignal( ' SIG1 ' " Emit Signal Synchronized! " );

    
///  发出延迟信号(5秒后执行)
    emit -> PostSignal( 5.0f ' SIG1 ' " Emit Signal Asynchronized! " );

    n_printf(
" *****Wait Asynchronized Signal***** " );
    
    
///  等待延迟信号
     double  time  =   0 ;
    
while  ( time  <=   8.0f )
    {
        signals
-> Trigger(nTimeServer::Instance() -> GetFrameTime());
        n_sleep(
0.2f );
        time 
+=   0.2f ;
    }

    n_printf(
" *****Press Any Key!***** " );

    
///  销毁KernelServer
    n_delete(ks);

    getchar();
    
return   0 ;
}
///  -Application
/// ----------------------------------------------------------------------------

 




这篇关于Nebula2探秘10-Signal System的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617811

相关文章

Partical System

创建"粒子系统物体"(点击菜单GameObject -> Create Other -> Particle System) 添加"粒子系统组件"(点击Component -> Effects  ->Particle System) 粒子系统检视面板  点击粒子系统检视面板的右上角的"+"来增加新的模块。(Show All Modules:显示全部) 初始化模块: •

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

System.getProperties().

Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

android6/7 system打包脚本

1.android5打包system就是网站上常见的制作ROM必备的解包打包system脚本 指令如下:mkuserimg.sh -s out/target/product/$TARGET_PRODUCT/system out/target/product/$TARGET_PRODUCT/obj/PACKAGING/systemimage_intermediates/system.img

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

Linux函数fcntl/system学习

本文针对项目中用到的几个函数进行详细分析,并尽可能的添加示例进行验证学习。比如fcntl/ioctl函数、system/exec函数、popen/pclose函数、mmap函数等。 重点参考了《UNP》和《Linux程序设计》第四版。 一、fcntl函数 fcntl函数可以改变或者查看已打开文件的性质。该函数的定义如下: #include <fcntl.h> int fcntl(

Spring Boot 注解探秘:HTTP 请求的魅力之旅

在SpringBoot应用开发中,处理Http请求是一项基础且重要的任务。Spring Boot通过提供一系列丰富的注解极大地简化了这一过程,使得定义请求处理器和路由变得更加直观与便捷。这些注解不仅帮助开发者清晰地定义不同类型的HTTP请求如何被处理,同时也提升了代码的可读性和维护性。 一、@RequestMapping @RequestMapping用于将特定的HTTP请求映射到特定的方法上

2024年 Biomedical Signal Processing and Control 期刊投稿经验最新分享

期刊介绍 《Biomedical Signal Processing and Control 》期刊旨在为临床医学和生物科学中信号和图像的测量和分析研究提供一个跨学科的国际论坛。重点放在处理在临床诊断,患者监测和管理中使用的方法和设备的实际,应用为主导的研究的贡献。 生物医学信号处理和控制反映了这些方法在工程和临床科学的界面上被使用和发展的主要领域。期刊的范围包括相关的评论论文(review p