[windows 下编译 libevent]
1.4版本
在windows下有工程, 但工程编译不过.
需要将几个文件加入到工程中.
最终的文件是: event.c evutil.c log.c signal.c win32.c.
还需要将win32code下的event-config.h复制到外面的目录下.
1.1a 版本
1、到libevent官网下载源码包,我下载的是 1.1a 版本(libevent-1.1a-win32-src.zip)
2、解压文件到一个目录
3、打开项目文件 {解压目录}/WIN32-Prj/libevent.dsw
4、设置libevent classes为当前活动项目
5、进行编译,编绎时会出错
err.c': No such file or directory
解决方法: 在源文件目录中删除文件err.c
error C2065: '__FUNCTION__' : undeclared identifier
解决方法: 在源文件config.h中加入如下行
#define __FUNCTION__ ""
重新编译,成功。
6、编译例子时,会出现错误
libevent.lib(win32.obj) : error LNK2001: unresolved external symbol ___WSAFDIsSet@8
libevent.lib(win32.obj) : error LNK2001: unresolved external symbol __imp__select@20
解决方法: 在源文件主程序中加入如下行
#pragma comment(lib,"ws2_32.lib")
重新编译,OK。
运行示例。
2.0版本
不知道怎么编译, nmake Makefile.nmake 无情的失败了.
可能是vc6被BS了
附: event分析:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
event_init()会产生一个 event_base, 每个使用libevent的线程需要这样一个 event_base. 如果你全局只有一个线程使用libevent的话, 不必关注event_base有关的函数.
———————————————————————
event_set 用于关联 (事件,Socket,回调函数), event_set 之后要使用 event_base_set 将事件关联到线程的 event_base 上, 如果你只有一个线程使用libevent的话则不必.
———————————————————————
event_add 用于将 event 增加到 event_base 的监听中去, 同一事件不能增加两次, 否则event_del一次之后会CPU上升到100%, libevent内部一直在event_del. 但事件超时timeout后还要再
重新event_add一次, 本来不知道为什么, 但后来发现了, libevent1.4是要重新add, libevent 2.0 不需要ReAdd.
———————————————————————
event_base_dispatch 是事件循环
———————————————————————
有 event_base_xxx 时要使用 event_base_xxx, 如 event_loopbreak 和 event_base_loopbreak, 否则会使用一个 全局变量 current_base, 如果你是单线程使用libevent的话可以不用
event_base.
———————————————————————
event 结构体只能在 libevent 的循环退出后才能删除.
比如你删除了一个event, 但可能该event的timeout事件会在event删除后回调, 这时event结构体中的base已经被我们干掉了.
我是在线程退出后再将那些event结构删除, 设计一个event池, 回收利用event.
timeval 是可以删除的, 可以使用临时变量, 虽然按指针传递给了libevent.
———————————————————————
libevent不是线程安全的, 要新增加socket事件监听的话要向线程发消息.
线程的循环是 libevent 的循环, 只能由libevent收消息.
因此需要一个线程收发消息的 socketpair, 依靠 libevent 来进行线程消息发送, 来控制这个线程,
参考 SPServer.
———————————————————————