[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.
———————————————————————