`
chriszeng87
  • 浏览: 741077 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Libjingle中重要概念

阅读更多

Signals、sigslot简介

在复杂的工程中,整个系统被分为数个模块,每个模块提供有限的功能,由上层调用从而组成整个系统,为了保证每个模块的独立性,我们经常限制模块与模块之间直接联系,每个模块只提供有限的APICom接口,内部完全封装起来。

       有时候两个不同的逻辑层的模块需要通信,如果直接include头文件会使项目变的复杂,sigslot的出现为我们提供了一种解决问题的思想,它用信号的概念实现不同模块之间的传输问题,sigslot本身类似于一条通讯电缆,两端提供发送器和接收器,只要把两个模块用这条电缆连接起来就可以实现接口调用,而sigslot本身只是一个轻量级的作品,整个库只有一个.h文件,所以无论处于何种层次的库,都可以非常方便的包含它。

 

 举个例子,我们设计一个发送消息的类,这个类负责在某种时刻向外界发出求救信号

#include "sigslot.h"

class Sender  
{
public:
    
// 定义信号,该信号有两个参数
    
sigslot::signal2< std::string , int > SignalDanger;
    
    
// 该函数发送消息
    
void Panic()
    
{
        
SignalDanger("Help!", 0); 
    
}
};

 

另外一个类则负责接收求助信号

class Receiver : public sigslot::has_slots<>
{
public:
    
// 接收SignalDanger 信号的函数,该函数参数必须和信号的参数一致
    
void OnDanger(std::string message, int time)
    
{
        
printf("I heard something like "%s" at %d!n", message.c_str(), time);
    
}
};

现在让我们在主逻辑中把这两个类连接起来

Sender sender;
Receiver receiver;

// 将发送者的信号连接到接收方的接收函数上;和断开连接
sender.SignalDanger.connect(&receiver, Receiver::OnDanger);

sender.SignalDanger.disconnect(&receiver);

只要在任何时候调用 sender.Panic()函数,就会把求救信号发送给接收者,而且这两个发送和接收端的模块都可以独立编译,不会出现版本问题。

 

libjingle命名规则:
信号命名:signal....
收到信号:on...
 

 

 

扩展思考:

1.       可以在消息循环处理函数中调用不同的类进行处理

 

 

Threads、signaling thread和worker thread

Libjingle部件使用一个或两个全局线程:

Signaling thread:它主要用来创建所有底层部件、例如Session ManagerControlXmpp.

worker thread(channel thread):被P2P组件对象用来处理更多资源密集的过程,例如数据流。放入独立线程中的这些数据流,被xmpp阻塞或被用户界面阻塞。使用worker thread的类有ChandleManagerSocketMonitorP2PtransportChannelport objects。为了使用该线程,你必须创建一个thread对象并将它传递到SessionMnagerconstructor中。如果没有线程对象传入、the thread in which sessionManager 被创建为工作线程。在CallClient::InitPhone中演示了如何为底层创建一个workthread线程。

 

此外,现在libjingle提供了一个SignalThread,扩展此类现存的类可用,可被实例化、开始、

 

尽管libjingle支持多线程,只有确认是线程安全的,例如在methods中:
ASSERT(talk_base::Thread::Current() == channel_thread_);
channel_thread_->Clear(this);
 
libjingle包装了线程、信号线程、工作线程和任何其他线程,用task_base::Thread. 所有线程对象是由ThreadManager管理。SessionManager调用ThreadManager::CurrentThread提供它用signal thread当它是实体。XmppPump使用当前线程的信号线。因此,你必须为信号线而创建一个线程对象,并将它放入ThreadManager的线程池中,之前需创建SessionManager对象,或者期待XmppPump开始工作。(看Siging in server代码例子)这里有两种方法创建线程:
·AutoThread 是用libjingle对象包装现有系统的线程,并使当前线程在ThreadManager的线程池中(将返回线程如果Thread::CurrentThread被调用)
·Thread为work thread创建和包装新线程。为了使用线程,创建一个新的Thread对象,调用ThreadManager::Add或ThreadManager::SetCurrent将它添加到线程池中,并调用Run()开始运行在阻塞循环中,或调用Start()开始线程侦听。
 
线程提供了信息交换的渠道在两个对象之间。例如SocketManager发送一个信息到他自己或别的线程为了摧毁socket。线程对象继承消息队列 ,和他们一起揭露发送 , 邮政和发送邮件同步和异步的其他方法。一个对象,它发送的邮件会收到使用消息队列必须继承和实施MessageHandler。MessageHandler定义onMessage方法,这与所谓的消息队列消息。
 
您可以将邮件发送到任何对象继承talk_base::MessageHandler对任何线程talk_base::MessageHandler但是,如果发送消息来执行一个资源密集的线,你应该发送的工作线程的消息。你能得到处理,要求SessionManager::worker_thread()。你能得到处理,要求SessionManager::signaling_thread()。
 
一个对象有几种方法来访问一个特定的线程:它可以请求和存储作为输入参数的线程的指针,它可以假定当前线程创建时(由ThreadManager访问::在其构造CurrentThread)是一个特殊的线程和高速缓存的成员指向它的指针,它可以调用SessionManger::signal_thread()或SessionManager::worker_thread()检索线程。所有这三个技术用于了libjingle。
 

因为对象可以在任何线程调用,对象可能需要验证的线程被调用的方法。要做到这一点,调用线程::目前 (即当前线程检索)和比对已知线程的价值-这可以是由SessionManager,或者对象暴露了一个线程可以存储在一个指针,它的初始线程构造。以下是调用在另一个线程上的同一个对象的方法,更加广泛的例子。

 转自:http://blog.csdn.net/shuixin536/article/details/8074498

分享到:
评论

相关推荐

    libjingle学习笔记

    libjingle中的重要概念 关于libjingle你应当理解下面的重要概念: Signals Threads and Messages Naming Conventions SSL Support Connections Transports, Channels, and Connections Candidates Data ...

    libjingle文档和0.4.0版本源码

    1. **项目简介**:介绍libjingle的基本概念,包括其设计理念、主要功能和适用场景。 2. **安装与配置**:详细说明如何在不同操作系统(如Linux、Windows和Mac OS X)上设置开发环境,包括编译工具链的安装和项目构建...

    WebRTC零基础开发者教程

    在本章节中,对Libjingle中的重要组件进行了说明,并且讲解了如何在这些组件的基础上建立一个Libjingle应用程序。 第五章内容是代码分析。这部分介绍了音频通道的建立过程,音频和视频的接收和播放过程。通过这些...

    WebRTC零基础开发者教程(纯净版)

    本文中提供下载的《WebRTC 零基础开发者教程》将以一个初学者的角度,从0开始逐步引导你掌握WebRTC开发的方方面面(当然,教程中更多的是操作性的内容,具体到技术原理和实现,显然不是本教程的讨论范畴)。...

    webrtc-demo-master.zip

    此外,由于WebRTC涉及到复杂的网络和多媒体处理,熟悉STUN/TURN服务器的概念也很重要,它们用于解决NAT穿透问题,确保两端能直接通信。 总的来说,"webrtc-demo-master.zip"提供了一个学习和实验WebRTC音频功能的...

    NAT.rar_NAT_NAT JAVA_java nat_nat

    在实际应用中,例如VoIP、在线游戏或P2P文件共享,理解并正确使用NAT技术至关重要。NAT穿透技术可以确保不同网络环境下的设备能够有效地通信,即便它们位于严格的NAT背后。 总结NAT的主要知识点: 1. NAT的概念和...

    webrtc教程(v0.3)

    Python工具在WebRTC的构建和测试过程中扮演着重要角色,例如用于自动化脚本编写等。 **1.4 本地集成开发环境(IDE)** - **Visualstudio** - **概述**:Visual Studio是一种非常强大的IDE,适用于Windows平台上...

    webrtc介绍

    Threading model(线程模型)是WebRTC中一个重要的概念,因为实时通信需要高效且同步的数据处理。WebRTC使用多线程来处理不同任务,如音频处理、视频编码/解码、网络传输等,确保低延迟和高效率。 Stream APIs...

    webrtc教程

    Python 在 WebRTC 的构建和测试过程中扮演着重要角色,许多自动化脚本和工具都是基于 Python 开发的。 ##### 1.4 本地集成开发环境(IDE) - **Visualstudio** - **简介**:Visual Studio 是一款由微软开发的强大...

    P2P穿透NAT源代码(Delphi).rar

    这里我们将深入探讨这些概念及其在实际应用中的重要性。 P2P网络是一种分布式网络架构,其中每个参与者,即“对等节点”或“peer”,既是服务的消费者也是服务的提供者。这种架构与传统的客户端-服务器模式不同,后...

    webrtc教程V3.0.pdf

    本教程旨在通过详细解读《webrtc教程V3.0.pdf》中的内容,帮助读者全面了解WebRTC的基本概念、关键技术以及实际应用。 #### 二、工具准备 ##### 1.1 depot_tools - **目标**:简化获取、构建和管理Chromium项目的...

    WebRTC零基础开发者教程(带目录版本)

    - **webrtc代码相关基础知识**:讲解了一些重要的编程概念和技术。 - **STUN和TURN技术浅析**:对这两种技术进行了简要分析。 - **基于ICE的VoIP穿越NAT改进方案**:提出了一些改进措施。 - **ubuntu安装使用...

Global site tag (gtag.js) - Google Analytics