libevent::事件::定时器2

#define evtimer_new(b, cb, arg)        event_new((b), -1, 0, (cb), (arg))

#include <cstdio>
#include <errno.h>
#include <sys/types.h>
#include <event.h>
#include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/event-config.h>
#include <event2/util.h>

void do_timeout(evutil_socket_t fd, short event, void *arg)
{
    printf("do timeout (time: %ld)!\n", time(NULL));
}

void create_timeout_event(struct event_base *base)
{
    struct event *ev;
    struct timeval timeout;
      //将事件和event_base绑定    ev = event_new(base, -1, EV_PERSIST, do_timeout, NULL);
    if (ev) {
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;
        event_add(ev, &timeout);
    }
}

int
main(int argc, char **argv)
{
    struct event_base *base;

    base = event_base_new();

    if (!base) {
        printf("Error: Create an event base error!\n");
        return -1;
    }

    create_timeout_event(base);
    event_base_dispatch(base);

    return (0);
}

原文地址:https://www.cnblogs.com/osbreak/p/10280038.html

时间: 2024-10-10 13:24:27

libevent::事件::定时器2的相关文章

[libevent]事件主循环

libevent事件处理的中心部分--事件主循环,根据系统提供的事件多路分发机制执行事件循环,对已注册的就绪事件,调用注册事件的回调函数来处理事件. 事件处理主循环 libevent的事件主循环主要是通过event_base_loop ()函数完成的,其主要操作如下面的流程图所示,event_base_loop所作的就是持续执行下面的循环. 上图的简单描述就是: 校正系统当前时间. 将当前时间与存放时间的最小堆中的时间依次进行比较,将所有时间小于当前时间的定时器事件从堆中取出来加入到活动事件队列

Libevent 事件生成

事件堆实例生成: struct event_base * event_base_new(void) { struct event_base *base = NULL; struct event_config *cfg = event_config_new(); if (cfg) { base = event_base_new_with_config(cfg); event_config_free(cfg); } return base; } event_config 结构如下 struct ev

并发编程---死锁||递归锁---信号量---Event事件---定时器

死锁 互斥锁:Lock(),互斥锁只能acquire一次 递归锁:  RLock(),可以连续acquire多次,每acquire一次计数器+1,只有计数为0时,才能被抢到acquire # 死锁 from threading import Thread,Lock import time mutexA = Lock() mutexB = Lock() class MyThread(Thread): def run(self): self.f1() self.f2() def f1(self):

libevent timer定时器

每隔一秒循环执行回调函数 #include <iostream> #include <event2/event.h> struct cb_arg { struct event *ev; struct timeval tv; }; void timeout_cb(int fd, short event, void *params) { puts("111"); struct cb_arg *arg = (struct cb_arg*)params; struct

对libevent+多线程服务器模型的C++封装类

最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型真的很不错,我将这个模型封装成一个C++类,根据我的简单测试,这个模型的效率真的很不错,欢迎大家试用. 这个类的使用方法很简单(缺点是不太灵活),只要派生一个类,根据需要重写以下这几个虚函数就行了: //新建连接成功后,会调用该函数virtual void ConnectionEvent(Conn *conn) { }//读取完数据后,会调用该函数virtual void ReadEvent(Conn *conn) 

Libevent库学习笔记

Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可以注册可读.可写.超时等事件,指定回调函数:当事件发生后,Libevent调用回调函数,可以在回调函数里实现自定义功能.编译库代码,编译脚本会判断OS支持哪种类型的事件机制(select.epoll或kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的. 著名分布式缓存软件memc

【转】libevent源码分析

libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和libevent的源码,做个小总结. 1.入门 1.1.概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库.Libevent有几个显著的亮点: (1)事件驱动(event-driven),高性能:(2)轻量级,专注于网络,不如 ACE 那么臃肿庞

libevent+多线程

最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型真的很不错,我将这个模型封装成一个C++类,根据我的简单测试,这个模型的效率真的很不错,欢迎大家试用. 这个类的使用方法很简单(缺点是不太灵活),只要派生一个类,根据需要重写以下这几个虚函数就行了: //新建连接成功后,会调用该函数 virtual void ConnectionEvent(Conn *conn) { } //读取完数据后,会调用该函数 virtual void ReadEvent(Conn *con

libevent学习笔记(参考libevent深度剖析)

最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析> libevent好处之类的就不赘述了,libevent和libiop,redis等一样都是采用事件回调机制,这种模式 被称作Reactor模式.正常事件处理流程是应用程序调用某个接口触发某个功能,而Reactor模式需要 我们将这些接口和宿主指针(谁调用这些接口)注册在Reactor,在合适的时机Reactor使用宿主指针 调用注册好的回调函数. 一: Reactor基本知