文件名称:延迟回调-visual c++ mfc编程实例
文件大小:1.05MB
文件格式:PDF
更新时间:2024-06-29 06:58:21
libevent
7.2 回调和水位 每个 bufferevent 有两个数据相关的回调:一个读取回调和一个写入回调。默认情况下,从底层传输端口读 取了任意量的数据之后会调用读取回调;输出缓冲区中足够量的数据被清空到底层传输端口后写入回调会 被调用。通过调整 bufferevent 的读取和写入 “ 水位(watermarks)”可以覆盖这些函数的默认行为。 每个 bufferevent 有四个水位: 1>读取低水位:读取操作使得输入缓冲区的数据量在此级别或者更高时,读取回调将被调用。默认值为 0,所以每个读取操作都会导致读取 回调被调用。 2>读取高水位:输入缓冲区中的数据量达到此级别后, bufferevent 将停止读取,直到输入缓冲区中足够 量的数据被抽取,使得数据量低于此级别。默认值是无限,所以永远不会因为输入缓冲区的大小而停止读 取。 3>写入低水位:写入操作使得输出缓冲区的数据量达到或者低于此级别时,写入回调将被调用。默认值是 0,所以只有输出缓冲区空的时候才会调用写入回调。 4>写入高水位: bufferevent 没有直接使用这个水位。它在 bufferevent 用作另外一个 bufferevent 的底层 传输端口时有特殊意义。请看后面关于过滤型 bufferevent 的介绍。 bufferevent 也有“错误”或者“事件”回调,用于向应用通知非面向数据的事件,如连接已经关闭或者发生错误。定义了下列事件标志: 1>BEV_EVENT_READING:读取操作时发生某事件,具体是哪种事件请看其他标志。 2>BEV_EVENT_WRITING:写入操作时发生某事件,具体是哪种事件请看其他标志。 3>BEV_EVENT_ERROR :操作时发生错误。关于错误的更多信息,请调用 EVUTIL_SOCKET_ERROR()。 4>BEV_EVENT_TIMEOUT:发生超时。 5>BEV_EVENT_EOF:遇到文件结束指示。 6>BEV_EVENT_CONNECTED:请求的连接过程已经完成。上述标志由 2.0.2-alpha 版新引入。 7.3 延迟回调 默认情况下,bufferevent 的回调在相应的条件发生时立即被执行。(evbuffer 的回调也是这样的,随后会介 绍)在依赖关系复杂的情况下,这种立即调用会制造麻烦。比如说,假如某个回调在 evbuffer A 空的时候向 其中移入数据,而另一个回调在 evbuffer A 满的时候从中取出数据。这些调用都是在栈上发生的,在依赖 关系足够复杂的时候,有栈溢出的风险。 要解决此问题,可以请求 bufferevent(或者 evbuffer)延迟其回调。条件满足时,延迟回调不会立即调用, 而是在 event_loop()调用中被排队,然后在通常的事件回调之后执行。 (延迟回调由 libevent2.0.1-alpha 版引入)