热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实战libjingle之sigslot,MessageHandler

接触过libjingle库,感慨于它强大的功能.这里不在全部描述libjingle模块.只是简单介绍下它两个模块(sigslot,MessageHandler).sigslot主

接触libjingle,感慨于它强大的功能.这里不在全部描述libjingle模块. 只是简单介绍下它两个模块(sigslot,MessageHandler).

sigslot主要用于对象的事件传递

Messagehandler是很好的异步触发处理机制.  

至于两者概念非本文描述,本文侧重于两者的实际运用.

先在Xcode下新建个Test工程

1.加入所需要的文件.如下图

  至于为什么只加入这这些文件,本人也没有搞懂,借鉴别人的.

2.工程设置里面

   a. 设置Other Linker Flags选项

   Other Linker Flags: -all_load   -ObjC

   b.  设置Header Search Paths 选项

    例如我的项目中libjingle放在路径: $(SRCROOT)/Test/libjingle

   要从网上下载完整的libjingle库

  c:设置Other C++ Flags选项:

///begin

-DV8_DEPRECATION_WARNINGS

-DEXPAT_RELATIVE_PATH

-DFEATURE_ENABLE_VOICEMAIL

-DGTEST_RELATIVE_PATH

-DJSONCPP_RELATIVE_PATH

-DFEATURE_ENABLE_PSTN

-DLOGGING=1

-DSRTP_RELATIVE_PATH

-DFEATURE_ENABLE_SSL

-DHAVE_SRTP

-DHAVE_WEBRTC_VIDEO

-DHAVE_WEBRTC_VOICE

-DUSE_WEBRTC_DEV_BRANCH

-DPSAPI_VERSION=1

-D_CRT_RAND_S

-DCERT_CHAIN_PARA_HAS_EXTRA_FIELDS

-D_ATL_NO_OPENGL

-D_HAS_EXCEPTIONS=0

-D_SECURE_ATL

-DCHROMIUM_BUILD

-DTOOLKIT_VIEWS=1

-DUSE_AURA=1

-DUSE_ASH=1

-DUSE_DEFAULT_RENDER_THEME=1

-DUSE_LIBJPEG_TURBO=1

-DENABLE_ONE_CLICK_SIGNIN

-DENABLE_REMOTING=1

-DENABLE_WEBRTC=1

-DENABLE_PEPPER_CDMS

-DENABLE_CONFIGURATION_POLICY

-DENABLE_INPUT_SPEECH

-DENABLE_NOTIFICATIONS

-DENABLE_EGLIMAGE=1

-D__STD_C

-DENABLE_TASK_MANAGER=1

-DENABLE_EXTENSIONS=1

-DENABLE_PLUGIN_INSTALLATION=1

-DENABLE_PLUGINS=1

-DENABLE_SESSION_SERVICE=1

-DENABLE_THEMES=1

-DENABLE_AUTOFILL_DIALOG=1

-DENABLE_BACKGROUND=1

-DENABLE_AUTOMATION=1

-DENABLE_GOOGLE_NOW=1

-DCLD_VERSION=2

-DENABLE_FULL_PRINTING=1

-DENABLE_PRINTING=1

-DENABLE_SPELLCHECK=1

-DENABLE_CAPTIVE_PORTAL_DETECTION=1

-DENABLE_APP_LIST=1

-DENABLE_SETTINGS_APP=1

-DENABLE_MANAGED_USERS=1

-DENABLE_MDNS=1

-DLIBPEERCONNECTION_LIB=1

-DHAVE_SCTP

-DSSL_USE_NSS

-DHAVE_NSS_SSL_H

-DSSL_USE_NSS_RNG

-DNSS_PLATFORM_CLIENT_AUTH

-DNO_NSPR_10_SUPPORT

-DNSPR_STATIC

-DNSS_ENABLE_ECC

-DNSS_STATIC

-DNSS_USE_STATIC_LIBS

-DUSE_UTIL_DIRECTLY

-DDYNAMIC_ANNOTATIONS_ENABLED=1

-DWTF_USE_DYNAMIC_ANNOTATIONS=1

-DPJ_IS_LITTLE_ENDIAN=1

-DPJ_IS_BIG_ENDIAN=0

-DPOSIX

-D_DEBUG

-DLIBCORE_EXPORTS

-D__STDC_CONSTANT_MACROS

-DV8_DEPRECATION_WARNINGS

-DEXPAT_RELATIVE_PATH

-DFEATURE_ENABLE_VOICEMAIL

-DGTEST_RELATIVE_PATH

-DJSONCPP_RELATIVE_PATH

-DLOGGING=1

-DSRTP_RELATIVE_PATH

-DFEATURE_ENABLE_SSL

-DFEATURE_ENABLE_PSTN

-DHAVE_SRTP

-DHAVE_WEBRTC_VIDEO

-DHAVE_WEBRTC_VOICE

-DUSE_WEBRTC_DEV_BRANCH

-D_FILE_OFFSET_BITS=64

-DCHROMIUM_BUILD

-DTOOLKIT_VIEWS=1

-DUI_COMPOSITOR_IMAGE_TRANSPORT

-DUSE_AURA=1

-DUSE_CAIRO=1

-DUSE_GLIB=1

-DUSE_DEFAULT_RENDER_THEME=1

-DUSE_LIBJPEG_TURBO=1

-DUSE_NSS=1

-DUSE_X11=1

-DUSE_CLIPBOARD_AURAX11=1

-DENABLE_ONE_CLICK_SIGNIN

-DUSE_XI2_MT=2

-DUSE_XI2_MT=2

-DENABLE_WEBRTC=1

-DENABLE_PEPPER_CDMS

-DENABLE_CONFIGURATION_POLICY

-DENABLE_INPUT_SPEECH

-DENABLE_NOTIFICATIONS

-DUSE_UDEV

-DENABLE_EGLIMAGE=1

-DENABLE_TASK_MANAGER=1

-DENABLE_EXTENSIONS=1

-DENABLE_PLUGIN_INSTALLATION=1

-DENABLE_PLUGINS=1

-DENABLE_SESSION_SERVICE=1

-DENABLE_THEMES=1

-DENABLE_AUTOFILL_DIALOG=1

-DENABLE_BACKGROUND=1

-DENABLE_AUTOMATION=1

-DENABLE_GOOGLE_NOW=1

-DCLD_VERSION=2

-DENABLE_FULL_PRINTING=1

-DENABLE_PRINTING=1

-DENABLE_SPELLCHECK=1

-DENABLE_CAPTIVE_PORTAL_DETECTION=1

-DENABLE_APP_LIST=1

-DENABLE_SETTINGS_APP=1

-DENABLE_MANAGED_USERS=1

-DENABLE_MDNS=1

-DLIBPEERCONNECTION_LIB=1

-DHAVE_SCTP

-DHASH_NAMESPACE=__gnu_cxx

-DPOSIX

-DDISABLE_DYNAMIC_CAST

-D_REENTRANT

-DSSL_USE_NSS

-DHAVE_NSS_SSL_H

-DSSL_USE_NSS_RNG

-DHAVE_INT16_T

-DHAVE_INT32_T

-DHAVE_INT8_T

-DHAVE_UINT16_T

-DHAVE_UINT32_T

-DHAVE_UINT64_T

-DHAVE_UINT8_T

-DHAVE_STDINT_H

-DHAVE_INTTYPES_H

-DHAVE_NETINET_IN_H

-DINLINE=inline

-DCPU_CISC

-DDYNAMIC_ANNOTATIONS_ENABLED=1

-DWTF_USE_DYNAMIC_ANNOTATIONS=1

-D_DEBUG

-D_GLIBCXX_DEBUG=1

-DIOS

-D__ARMEL__

-D_ARM_

-DNO_CRYPTO

-DNODEBUG

///end

3. 设置Build Phases的Compile Sources中的

 maccocoathreadhelper.mm

 scoped_autorelease_pool.mm文件为 -fno-objc-arc

原因在两个文件是为非ARC的,如果你的是非ARC,就略这一项

//至此引入库成功,编译没有问题了



4.工程介绍

  网上讲解sigslot都是使用receive和sender为例子,我也借用下.同时实现了MessageHandler异步触发,说简单概要点就是post和OnMessage

//Receive.h

#include

#include

#include

#include "sigslot.h"

#include "thread.h"

#include "messagehandler.h"

#include "Sender.h"

class Receive :publicsigslot::has_slots<>,publictalk_base::MessageHandler {

public:

    Receive(void);

    ~Receive();

    enum {

        Message_Init,

        Message_Destory,

    };

    //初始化和销毁

    void InitData(constchar *json);

    void Destory();

    //继承MessageHandler的消息处理

    virtual void OnMessage(talk_base::Message* msg);

    //sigslot事件 注册一个Event事件

    /*注意这里的参数必须和Sender中的SignalEventContent参数个数匹配*/

    void OnEvent(Sender* mysender,Sender::SenderStatus,int code, const std::string& content);

private:

    talk_base::Thread *_receiveThread;

    Sender* _sender;

};

//receive.cpp

#include "Receive.h"

Receive::Receive(void) {

    _receiveThread &#61; new talk_base::Thread();

    _receiveThread->SetName("ReceiveThread",_receiveThread);

    _receiveThread->Start();

}

Receive::~Receive() {

    //这里Post Message_Destory消息,通知释放资源

    _receiveThread->Post(this,Message_Destory);

    delete_receiveThread;

    _receiveThread &#61; NULL;

}

void Receive::Destory() {

    //释放资源

}

//外部接口,形参为json格式,支持任意参数接入

void Receive::InitData(constchar *json) {

    //这里可以使用_myThread->Post(this,Message_Init)方式(类似Message_Destory)进一步初始化操作.不例举了.

    //创建发送事件对象

    _sender &#61; newSender();

    //sender对象和receive对象建立连接

    _sender->SignalEventContent.connect(this, &Receive::OnEvent);

}

void Receive::OnEvent(Sender *mysender,Sender::SenderStatus,int code,conststd::string& content) {

    //事件响应接口.通过sigslot实现了sender对象中的事件传递到receive对象

}


void Receive::OnMessage(talk_base::Message *msg) {

    switch (msg->message_id) {

        caseMessage_Destory: {

            Destory();

        }

            break;

    }

}

//sender.h

#include

#include

#include

#include "sigslot.h"

#include "thread.h"

#include "messagehandler.h"

class Sender

    :publicsigslot::has_slots<>,

     publictalk_base::MessageHandler {

public:

    Sender(void);

    ~Sender();

    enum SenderStatus {

        Sender_Init,

        Sender_Destroy,

        Sender_Event,

    };

    //signal4表示后面接4个参数,sigslot里面最多支持8个参数,要支持不同的参数使用signal0-8

    /*4个参数分别表示:当前类指针,Status,codecontent*/

    sigslot::signal4int,const std::string& > SignalEventContent;

    void OnNetWorkEvent(int code,const std::string& content);

    //继承关系不能省略

    virtual void OnMessage(talk_base::Message* msg);

private:

    //talk_base::Thread *_senderThread;

};

//sender.cpp

#include "Sender.h"

Sender::Sender(void) {

   /* _senderThread &#61; new talk_base::Thread();

    _senderThread->SetName("SendThread", _senderThread);

    _senderThread->Start();*/

}

Sender::~Sender() {}


void Sender::OnNetWorkEvent(int code,conststd::string& content) {

    // 通过网络响应的事件接口(网络超时,接收数据接口)

    //使用sigslot,使sender的对象传递事件

    SignalEventContent(this,Sender_Event,code,content);

}

void Sender::OnMessage(talk_base::Message* msg) {}


推荐阅读
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
初2新生_349
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有