回调函数

基于TCP异步的聊天室程序

独自空忆成欢 提交于 2019-11-29 01:20:13
话说这个学期我们有一门课叫“中间件”,老师叫我们做一个基于TCP的聊天程序,主要结构如图 1.所有Client端需要与Server端连接(感觉这句话好白痴,TCP肯定要连接了才能工作) 2.Client端的功能是可以群发和私聊(用过QQ都应该知道什么是群发和私聊吧),但都必须经过Server端中转,也就是实现了类似通讯中间件的功能。 PS:开始写之前我是对网络编程这块完全没有认识的,上网找了几个TCP的程序,都是只能实现群发功能,或者只能实现client与server之间相互发的功能, 还没有哪个是可以实现上面所说的功能的程序的(如果有的请留言给我,我去下一个下来学习一下,O(∩_∩)O谢谢)。 实现方法有好多,用Socket类可以实现,用 TcpClient类和TcpListener类也可以实现,我就选择了后者,因为比较简单。 下面就列一下我用到的技术: 多线程,异步回调,委托,设计模式的观察者模式………… 先让大家看一下客户端和服务器端的界面先吧(本人不会做界面,而且界面上有很多Label是用来检查接收的情况,请大家选择性过滤掉) server端的 client端的 1.Server端先启动服务,新建一个线程,绑定一个套接字,之后监听 2.Client端点击连接之后,就会与Server端建立连接。 3.每当有一个Client加入Server时

Linux 4.0的dmaengine编程

*爱你&永不变心* 提交于 2019-11-29 00:01:21
在Linux 4.0下进行dmaengine的编程主要分为两部分,DMA Engine控制器编程和DMA Engine API编程。 DMA Engine API编程 slave DMA用法包括以下的步骤: 1. 分配一个DMA slave通道; 2. 设置slave和controller特定的参数; 3. 获取一个传输描述符; 4. 提交传输描述符; 5. 发起等待的请求并等待回调通知。 下面是以上每一步的详细说明。 1. 分配一个DMA slave通道 在slave DMA上下文通道的分配略有不同,客户端驱动通常需要一个通道,这个通道源自特定的DMA控制器,在某些情况甚至需要一个特定的通道。请求通道的API是channel dma_request_channel()。 其接口如下: struct dma_chan *dma_request_channel(dma_cap_mask_t mask, dma_filter_fn filter_fn, void *filter_param); 1 2 3 其中dma_filter_fn接口定义如下: typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param); 1 filter_fn是可选的,但是对于slave和cyclic通道我们强烈推荐使用

C 语言实现回调函数

大憨熊 提交于 2019-11-28 21:52:41
优点 不需要改变调用的主函数,只需添加命令和相应函数。 #include "stdio.h" #include "stdlib.h" #include "string.h" static void cmd_hello(void) { hello(); } static void cmd_hi(void) { hi(); } static void cmd_exit(void) { printf("process will exit!!!\n"); exit(0); } void hello(void) { printf("console output:hello\n"); } void hi(void) { printf("console output:hi\n"); } typedef void (*callback) (void); // define command struct typedef struct cmd { char name[10]; // define command name callback func; // define callback function }cmd_t; // define command array const cmd_t cmd_tbl[] = { {"hello",cmd_hello}, {"hi",cmd_hi}, {

$.ajax 完整参数

旧城冷巷雨未停 提交于 2019-11-28 21:42:33
$.ajax 完整参数 jquery中的ajax方法参数 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。 type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。 timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。 async: 要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。 cache: 要求为Boolean类型的参数,默认为true(当dataType为script时,默认为false),设置为false将不会从浏览器缓存中加载请求信息。 data: 要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换,可以查看  processData选项。对象必须为key/value格式,例如: { foo1:"bar1", foo2:"bar2" } =>&foo1=bar1&foo2=bar2。 //如果是数组

vue2中使用this的问题

こ雲淡風輕ζ 提交于 2019-11-28 21:39:58
在回调函数中使用this时与微信小程序有一样的问题,在回调函数中使用this有时会不生效,保险起见,在回调函数使用this前,要把this赋给其他参数,如下例: 来源: https://www.cnblogs.com/jcydd/p/11427548.html

jQuery 源码分析(五) map函数 $.map和$.fn.map函数 详解

那年仲夏 提交于 2019-11-28 21:32:17
$.map() 函数用于使用指定函数处理数组中的每个元素(或对象的每个属性),并将处理结果封装为新的数组返回,该函数有三个参数,如下:   elems   Array/Object类型 指定的需要处理的数组或对象。   callback  遍历时执行的回调函数   arg    参数,执行回调函数时传入的参数 callback函数执行时可以带两个参数,分别是遍历时对应的值和它的索引(对象来说则是键名),如果有返回值,则将返回值拼凑为一个数组 $.fn.map()返回值是一个jQuery对象,它也是调用$.map()来实现的,返回的数组最后又调用pushStack创建一个jQuery对象而已,如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js"></script> </head> <body> <p id="p1">文本1</p> <p id="p2">文本2</p> <h1 id="h1">标题1</h1> <h1 id="h2">标题2</h1> <script> var arr=[11,12,13,14]; var a =$

Ajax校验

谁说胖子不能爱 提交于 2019-11-28 20:40:46
一、Ajax简介 AJAX即(Asynchronous JavaScript and Xml)(异步JavaScript和XML),是指一种创建交互式 网页 应用的网页开发技术。 Ajax的关键元素包括以下内容: ① JavaScript语言:Ajax技术的主要开发语言。 ② XML/JSON/HTML等:用来封装请求或响应的数据格式 ③ DOM(文档对象模型):通过DOM属性或方法修改页面元素,实现页面局部刷新 ④ CSS:改变样式,美化页面效果,提升用户体验度 ⑤ Ajax引擎:即XMLHttpRequest对象,以异步方式在客户端与服务器之间传递数据。 二、Ajax工作流程 三、常用方法: 四、常用属性 五、实现思路:   1、锁定用户名文本框,注册onblur事件   2、创建XMLHttpRequest对象。通过window.XMLHttpRequest的返回值判断创建XMLHttpRequest对象的方式   3、设置回调函数。通过onreadystatechange属性设置回调函数,其中回调函数需要自定义   4、初始化XMLHttpRequest对象。通过open()设置请求的发送方式和路径   5、发送请求 jsp页面: <body> 用户名:<input type="text" name="txtName" id="txtName"/> <span id=

sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close

倾然丶 夕夏残阳落幕 提交于 2019-11-28 20:35:21
打开数据库链接sqlite3_open用法 原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 用这个函数开始数据库操作。需要传入两个参数,一是数据库文件名,比如:E:/test.db。文件名不需要一定存在,如果此文件不存在,sqlite会自动建立它。如果它存在,就尝试把它当数据库文件来打开。二是sqlite3**,即前面提到的关键数据结构。这个结构底层细节如何,你不要管它。 函数返回值表示操作是否正确,如果是SQLITE_OK则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考sqlite3.h 文件。里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。只要你会看英文,sqlite 可以让你学到不少东西)。 关闭数据库链接sqlite3_close用法 原型: int sqlite3_close(sqlite3 *ppDb); ppDb为刚才使用sqlite3_open打开的数据库链接 执行sql操作sqlite3_exec用法 原型: int sqlite3_exec( sqlite3* ppDb, /* An open

JavaScript中的Promise

爱⌒轻易说出口 提交于 2019-11-28 19:47:21
1.什么是Promise Promise是抽象异步处理对象以及对其进行操作的组件。Promise并不是从JavaScript中发祥的概念。Promise最初被提出是在 E语言 中, 它是基于并列/并行处理设计的一种编程语言。另外,如果说到基于JavaScript的异步处理,我想大多数都会想到利用回调函数。可以说promise的功能是可以将复杂的异步处理轻松地进行模式化, 这也可以说得上是使用promise的理由之一。 Promise的状态 Promis有三种状态: Pending:进行中 Resolved(Fulfilled):已完成 Rejected:已失败; 而promise状态变化只有两种: Pending --> Resolved Pending --> Rejected 这意味着,一个Promise对象resolve之后,状态就一直停留在Resolved那里了,反过来reject也一样。 这种特点的结果是,Promise对象的状态改变之后,你再给它添加回调函数,这个函数也会执行。 这跟事件监听器很不一样 —— 你一旦错过某个事件,就没办法再捕获他了,除非这个事件再次发生。 .then()和catch() Promise构造器接受一个函数作为参数,这个函数有两个参数:resolve,reject,分别代表这个Promise实例成功之后的回调函数和失败之后的回调函数

线程池及其原理和使用

眉间皱痕 提交于 2019-11-28 19:30:56
系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。 线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。 此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python 解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数。 线程池的使用 线程池的基类是 concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用于创建线程池,而 ProcessPoolExecutor 用于创建进程池。 如果使用线程池/进程池来管理并发编程,那么只要将相应的 task 函数提交给线程池/进程池,剩下的事情就由线程池/进程池来搞定。 Exectuor 提供了如下常用方法: 1.submit(fn, *args, **kwargs):将 fn 函数提交给线程池。