ibevent在windows下的使用示例之定时器

一 主循环

每个服务器都有一个主循环,在开始主循环的过程中,会用到以下几个函数:

// 创建成功返回一个拥有默认设置的 event base
// 创建失败返回 NULL
struct event_base *event_base_new(void);

// event_base 的释放
void event_base_free(struct event_base *base);

// 指定一个 event_base 并开始事件循环
// 此函数内部被实现为一个不断进行的循环
// 此函数返回 0 表示成功退出
// 此函数返回 -1 表示存在未处理的错误
int event_base_dispatch(struct event_base *base);

代码示例如下:

int main()
{
	// 创建默认设置的event base,失败返回NULL
	struct event_base* base = event_base_new();

	// 开启时间循环
	event_base_dispatch(base);

	// 释放
	event_base_free(base);

	return 0;
}

二 注册事件

libevent是事件驱动的,现在需要注册事件到主循环。

1 事件类型

// 超时
#define EV_TIMEOUT      0x01

// event 相关的文件描述符可以读了
#define EV_READ         0x02

// event 相关的文件描述符可以写了
#define EV_WRITE        0x04

// 被用于信号检测
#define EV_SIGNAL       0x08

// 用于指定 event 为 persistent
#define EV_PERSIST      0x10

// 用于指定 event 会被边缘触发(Edge-triggered 可参考 http://name5566.com/3818.html)
#define EV_ET  

2 回调函数类型

// event 的回调函数
// 参数 evutil_socket_t --- event 关联的文件描述符
// 参数 short --- 当前发生的条件(也就是上面定义的条件)
// 参数 void* --- 其为 event_new 函数中的 arg 参数
typedef void (*event_callback_fn)(evutil_socket_t, short, void *);

3 事件相关操作

// 创建 event
// base --- 使用此 event 的 event_base
// what --- 指定 event 关心的各种条件(也就是上面定义的条件)
// fd --- 文件描述符
// cb --- event 相关的回调函数
// arg --- 用户自定义数据
// 函数执行失败返回 NULL
struct event *event_new(struct event_base *base, evutil_socket_t fd,
    short what, event_callback_fn cb,
    void *arg);

// 释放 event(真正释放内存,对应 event_new 使用)
// 可以用来释放由 event_new 分配的 event
// 若 event 处于 pending 或者 active 状态释放也不会存在问题
void event_free(struct event *event);

// 清理 event(并不是真正释放内存)
// 可用于已经初始化的、pending、active 的 event
// 此函数会将 event 转换为非 pending、非 active 状态的
// 函数返回 0 表示成功 -1 表示失败
int event_del(struct event *event);

4 事件注册

// 用于向 event_base 中注册 event
// tv 用于指定超时时间,为 NULL 表示无超时时间
// 函数返回 0 表示成功 -1 表示失败
int event_add(struct event *ev, const struct timeval *tv);

代码示例如下:

// 事件回调函数
void callBack(evutil_socket_t fd, short ev, void *args)
{
	printf("%s\n", (char*)args);
}

int main()
{
	// 创建默认设置的event base,失败返回NULL
	struct event_base* base = event_base_new();

	// 创建事件
	struct event* ev = event_new(base, NULL, EV_TIMEOUT, callBack, (char*)"TimeOut");

	// 注册事件
	const struct timeval outtime = {5, 0};
	event_add(ev, &outtime);

	// 开启时间循环
	event_base_dispatch(base);

	// 释放
	event_base_free(base);

	return 0;
}

三 其他配置和优化

在win32下需要初始化网络, 代码示例如下:

// 事件回调函数
void callBack(evutil_socket_t fd, short ev, void *args)
{
	printf("%s\n", (char*)args);
}

int main()
{
	// 初始化网络
	WORD wVersionRequested = MAKEWORD(2, 2);
        WSADATA wsaData;
        WSAStartup(wVersionRequested, &wsaData);

	// 创建默认设置的event base,失败返回NULL
	struct event_base* base = event_base_new();

	// 创建事件
	struct event* ev = event_new(base, NULL, EV_TIMEOUT, callBack, (char*)"TimeOut");

	// 注册事件
	const struct timeval outtime = {5, 0};
	event_add(ev, &outtime);

	// 开启时间循环
	event_base_dispatch(base);

	// 释放
	event_base_free(base);

	return 0;
}

优化一下代码结构,最终代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <Winsock2.h>

#include <event2/event.h>
#include <event2/util.h>

// 初始化网络
void initNetwork()
{
	WORD wVersionRequested = MAKEWORD(2, 2);
    WSADATA wsaData;
    (void)WSAStartup(wVersionRequested, &wsaData);
}

// 事件回调函数
void callBack(evutil_socket_t fd, short ev, void *args)
{
	printf("%s\n", (char*)args);
}

// 开始主循环
void startEventLoop()
{
	// 创建默认设置的event base,失败返回NULL
	struct event_base* base = event_base_new();

	// 创建事件
	struct event* ev = event_new(base, NULL, EV_TIMEOUT, callBack, (char*)"TimeOut");

	// 注册事件
	const struct timeval outtime = {5, 0};
	event_add(ev, &outtime);

	// 开启时间循环
	event_base_dispatch(base);

	// 释放
	event_base_free(base);
}

int main()
{
	initNetwork();
	startEventLoop();

	return 0;
} 
时间: 2024-08-05 22:06:53

ibevent在windows下的使用示例之定时器的相关文章

Windows下Ionic Android开发环境搭建

转自 http://www.itwap.net/ArticleContent.aspx?id=26 来源: itwap.net 作者: 词略 时间: 2015-4-2 16:57:28 (一)Ionic简单介绍:   首先,Ionic是什么. Ionic是一款基于PhoneGap及AngularJS开发Hybrid/Web APP的前端框架,类似的其他框架有:Intel XDK等. 简单来说就是可以将你的Web应用打包发布成IOS/Android APP,并且提供了PhoneGap之外很多强大的

[转]CUDA在Windows下的软件开发环境搭建

引自:http://www.makaidong.com/yaoyuanzhi/archive/2010/11/13/1876215.html 本文我们以visual studio 2005 为例演示cuda的安装以及软件开发环境搭建,以及cuda与mfc联调的实现. 1.cuda安装包 cuda是免费使用的,各种操作系统下的cuda安装包均可以在http://www.nvidia.cn/object/cuda_get_cn.html上免费下载.cuda提供3个安装包,分别是: driver, t

(转)windows下安装Ionic

原文:http://www.itwap.net/ArticleContent.aspx?id=26 Ionic官方教程: http://learn.ionicframework.com/videos/windows-android/ 以下内容参考官方教程得出.         1.下载JDK并配置好Java运行环境   下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Oracle instant client在windows下的安装和使用【转】

[转] Oracle instant client在windows下的安装和使用 转载自 placidcreate 最终编辑 placidcreate [安装]从oracle官方网站下载instant client文件,(http://www.oracle.com/technetwork/topics/winx64soft-089540.html) 一般来说,有basic.sqlplus.odbc.jdbc,就足够用的了: instantclient-basic-win32-11.2.0.1.0

初探WINDOWS下IME编程

初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本人对IME的研究结果,并提供示例工程供大家参考: 下载示例工程 10.6K 本文示例程序运行结果如上图1.将用到的API RegOpenKey:打开注册表一键RegQueryValue:查询一键值RegQueryValueEx:同上RegCloseKey:关闭打开的键 LoadKeyboardLay

windows下Qt5.2 for android开发环境搭建

windows下Qt5.2 forAndroid开发环境配置 1.下载安装Qt 5.2.0 for Android (Windows 32-bit)   http://qt-project.org/downloads 2.打开Qt Creator,打开帮助,输入android,找到官方说明,按照教程一步步的操作. 3.首先需要下载以下四个软件: 1)The Android SDK Tools  下载安装 2)The Android NDK  下载并解压,注意不能有空格   3)Apache An

[WebServer] Windows下Apache与Tomcat的整合

转自:http://bbs.blueidea.com/thread-2873268-1-1.html 准备工作:1. Apache 2.2.4下载地址:http://cztele1.skycn.com/down/apache_2.2.4-win32-x86-no_ssl.zip 2. Tomcat 6.0.16下载地址:http://apache.mirror.phpchina.co ... e-tomcat-6.0.16.zip 3. JDK下载地址:http://cds.sun.com/is

windows下《七天学会NodeJS》学习笔记之二--代码的组织和部署

本系列第一篇:<windows下<七天学会NodeJS>学习笔记之一--NodeJS基础>,请参见这儿:http://blog.csdn.net/fm2005/article/details/41348813 模块路径解析规则:nodejs支持三种解析方式:/或C:开头的绝对路径:./开头的绝对路径:按照一定规则解析路径,直到找到模块位置. 内置模块:如果传递给require的是NodeJS内置模块名称,则不解析,直接返回内部模块导出对象. node_modules目录:node_

在Windows下编译ffmpeg完全手册

本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注: 1.       对于compile和build这两个词,本文统一的使用编译这个词,根据上下文读者应能区分语义上的差别. 本文的目的是提供一切与FFmpeg在Windows下的相关帮助.它最初是一个针对用MSys+MinGW系统编译的手把手的教程,现在也增加了如何在你的项目中链接FFmpeg所产