回调函数

音视频即时通讯的基本开发流程

核能气质少年 提交于 2020-01-04 06:42:06
面对现在的即时通讯应用软件的崛起,很多开发者也是竭尽所能在这方面进行研究和学习!今天我在这里介绍一款音视频即时通讯的开发流程。 下面列出AnyChat Platform Core SDK基本开发流程,适用于开发视频会议系统、语音视频聊天系统、远程教育平台以及即时通讯平台(IM)等。 一、初始化 该部分是首先要完成的,用于设置SDK的一些行为,包括设置对应的回调函数、设置SDK组件路径、设置是否产生日志文件等,通常初始化AnyChat SDK的代码如下(C++): // 打开(关闭)SDK的日志记录功能 02.BRAC_ActiveCallLog(TRUE); 03. 04.// 设置SDK核心组件所在目录 05.CHAR szCoreSDKPath[MAX_PATH] = {0}; 06.GetModuleFileName(NULL,szCoreSDKPath,sizeof(szCoreSDKPath)); 07.(strrchr(szCoreSDKPath,'\\'))[1] = 0; 08.BRAC_SetSDKOption(BRAC_SO_CORESDK_PATH,szCoreSDKPath,strlen(szCoreSDKPath)); 09. 10.// 根据BRAC_InitSDK的第二个参数:dwFuncMode,来告诉SDK该如何处理相关的任务(详情请参考开发文档)

Socket调用方式(同步,异步,阻塞,非阻塞)

我们两清 提交于 2020-01-04 04:54:23
同步 : 我调用一个功能,该功能没有结束前,我死等结果。 异步 : 当一个异步过程调用发出后,调用者不能立刻得到结果。该功能在完成后,通过状态、通知和回调来通知调用者。 同步和非同步关注的是调用者是否等待等待调用结果。 举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。 而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。 阻塞 : 调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。 非阻塞 : 调用我(函数),我(函数)立即返回通知调用者 以最常用的send和recv两个函数为例 比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回

ROS初学者常见问题

こ雲淡風輕ζ 提交于 2020-01-04 03:23:56
1. msg定义方式 在C++中,数组的定义一般是uint8 a[ ],在ros中定义topic所用的msg时,采用的是uint8 [ ] a; 2. ros包依赖的添加 在package.xml中添加包的依赖,所有者等信息,要严格按照模板进行,否则会出现报错。 3. CmakeLists.txt文件理解 单个功能包可以包含多个节点,多个节点都要配置自己的执行文件和参考库,每个节点智能存在一个main(),对于初学者可能经常注意不到。   对于使用Roboware的同学来说,添加文件时显示的可执行文件、新的库文件是不同含义,可执行文件中需要包含main(),库文件作为参考,没有main()。    这是CmakeLists.txt中,对于节点的管理 add_executable(ipc_serial src/ipc_serial.cpp ) add_dependencies(ipc_serial ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(ipc_serial ${catkin_LIBRARIES} ) 4. 回调函数调用 回调函数是否调用是通过spin()函数进行检查的,可以设置通过spin()一直检查回调,也可以通过以下方式以 一定频率 检查回调函数。

React中ref的用法

梦想与她 提交于 2020-01-04 01:26:40
在React数据流中,父子组件唯一的通信方式是通过props属性;那么如果有些场景需要获取某一个真实的DOM元素来交互,这时候就要用到React的refs属性。 1、可以给DOM元素添加ref属性 class TestApp extends React.Component{ constructor(props){ super(props); this.handleSubmit = this.handleSubmit.bind(this); } handleSubmit(e){ e.preventDefault(); console.log(`姓名:${this.nameInput.value}`); console.log(`学校:${ReactDOM.findDOMNode(this.refs.schoolInput).value}`); } render(){ return( <form> <input type="text" ref={(nameInput) => {nameInput.focus();this.nameInput = nameInput}}/><br></br> <input type="text" ref="schoolInput"/><br></br> <button onClick={this.handleSubmit}>提交</button> <

ViewGroup measure layout

て烟熏妆下的殇ゞ 提交于 2020-01-03 13:47:50
ViewGroup的绘图流程:ViewGroup绘制包括两个步骤:1.measure 2.layout   在两个步骤中分别调用回调函数:1.onMeasure() 2.onLayout()   1.onMeasure() 在这个函数中,ViewGroup会接受childView的请求的大小,然后通过childView的 measure(newWidthMeasureSpec, heightMeasureSpec)函数存储到childView中,以便childView的getMeasuredWidth() andgetMeasuredHeight() 的值可以被后续工作得到。   2.onLayout() 在这个函数中,ViewGroup会拿到childView的getMeasuredWidth() andgetMeasuredHeight(),用来布局所有的childView。   3.View.MeasureSpec 与 LayoutParams 这两个类,是ViewGroup与childView协商大小用的。其中,View.MeasureSpec是ViewGroup用来部署 childView用的, LayoutParams是childView告诉ViewGroup 我需要多大的地方。   4.在View

大熊君大话NodeJS之------Global Objects全局对象

为君一笑 提交于 2020-01-02 01:34:16
一,开篇分析 在上个章节中我们学习了NodeJS的基础理论知识,对于这些理论知识来说理解是至关重要的,在后续的章节中,我们会对照着官方文档逐步学习里面的各部分模块,好了该是本文主角登台亮相的时候了, Global 让我们来看一下官方的定义: Global Objects全局对象 These objects are available in all modules. Some of these objects aren't actually in the global scope but in the module scope - this will be noted. 这些对象在所有的模块中都可用。实际上有些对象并不在全局作用域范围中,但是在它的模块作用域中------这些会标识出来的。 In browsers, the top-level scope is the global scope. That means that in browsers if you're in the global scope var something will define a global variable. In Node this is different. The top-level scope is not the global scope; var something inside a

android回调函数总结

China☆狼群 提交于 2020-01-01 01:21:51
本文转载自: https://www.cnblogs.com/elleniou/archive/2012/05/21/2511071.html 作者:elleniou 转载请注明该声明。 回调函数就是那些自己写的,但是不是自己来调,而是给别人来掉的函数。 消息响应函数就可以看成是回调函数,因为是让系统在合适的时候去调用。这不过消息响应函数就是为了处理消息的, 所以就拿出来单做一类了。其实本质上就是回调函数。 但是回调函数不是只有消息响应函数一种,比如在内核编程中,驱动程序就要提供一些回调函数, 当一个设备的数据读写完成后,让系统调用这些回调函数来执行一些后续工作。 回调函数赋予程序员这样一种能力,让自己编写的代码能够跳出正常的程序控制流, 适应具体的运行环境在正确的时间执行。 回调函数总结 别人给回调的定义: 所谓回调,就是对象A调用另一对象B中的某个方法b,然后B又在某个时候反过来调用A中的某个函数c,对于B来说,这个c便叫做回调函数。 回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口. 我的理解, 和一般的类之间的组合类似。就只是A对象调用B对象的一个方法b。只不过方法b是抽象的,是后期绑定的。 java回调代码。 1,定义回调接口。 package com.smart; /** * 定义回调接口 */ public interface

ajax 跨域请求

痞子三分冷 提交于 2020-01-01 01:20:46
一、使用ajax进行跨域请求是会出现错误: Access to XMLHttpRequest at 'http://www.smarthui.top/memo/major.json' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 二、解决方案: (1) 在ajax中 dataType: "jsonp",//预期服务器返回的数据类型 datatype设置为jsonp。 JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议。我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式。 一个是描述信息的格式,一个是信息传递双方约定的方式。 为了便于客户端使用数据,逐渐形成了一种非正式传输协议

C++ 线程 第一次使用

人盡茶涼 提交于 2020-01-01 01:20:13
经常会遇到以下场景: 1、在界面程序中执行某个耗时操作: 界面的UI消息循环运行在某一个单独的线程中,一般是主线程,这个时候如果有一个耗时的操作,比如说是下载,如果也放到UI 线程中去,那么界面线程就会阻塞在下载操作那儿,导致界面卡死,这个时候就要将下载操作放到线程中去。 2、守护线程: 我们希望监视某件事情是否发生,比如监视某一个服务是否停止,如果停止就将它重新启动,一般情况下会去新开一个进程去做这些事情,我们将它称为守护进程,但是有的时候仅仅只是心跳检测而已(每个一段时间检查一下),开启一个线程不划算(主要指进程间通信),这个时候可以将这个心跳任务放到线程里。 3、加速线程: 现在的cpu很少有单核单线程的cpu,比如我现在的电脑就是4核8线程的,一个线程最多可以占用1/8cpu,这个时候就可以开8 个线程来加速运算。 这些场景都有一个共同的特点:在同一时刻(不考虑并行并发,指的是看上去是同一时刻)运行多个程序段。 使用C11的线程 从C11开始,C++加入了对线程的支持,意味着可以使用std库编写平台无关的多线程代码了。 第一个线程程序: #include <thread> #include "color_print.h" /** 不带参数的线程回调 */ void ThreadCallBack() { for (int i = 0; i < 100; ++i) {

Linux信号机制

回眸只為那壹抹淺笑 提交于 2020-01-01 00:24:43
1.信号本质   信号是进程间通信机制中唯一的异步通信机制,在软件层次上是对中断机制的一种模拟。即信号类似软中断。   信号和软中断的区别:     [1]中断有优先级,而信号没有优先级。     [2]信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行。     [3]中断响应是及时的,而信号响应通常都有较大的时间延迟。 2.信号的种类    信号分为可靠信号和不可靠信号。   可靠信号:可靠信号即通过排队的方式使信号不会丢失,信号值位于[SIGRTMIN,SIGRTMAX]之间的信号都是可靠信号。   不可靠信号:信号值小于SIGRTMIN的信号都是不可靠信号,即不会进行排队。 [root@node01 ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU