事件select模型

windows处理用户行为的两种方式

消息机制:

核心
消息队列
处理过程
将所有的用户操作, 如点鼠标、按键盘等所有操作按顺序被记录, 装入一个队列
特点
由操作系统维护, 我们需要把消息取出来, 分类处理
有先后顺序
异步选择就是基于消息机制的

事件机制:

核心
事件集合
处理过程
每个操作绑定一个事件, 事件由调用API创建
将事件投递给系统, 让系统监视
如果操作发生, 对应事件就会被标记位有记号
我们检测事件集合, 处理
特点
所有事件都是我们自己定义的, 系统只是将他们置为有/无信号
无序的
事件选择就是应用事件机制

局部事件机制(需要我们绑定), 整体消息机制(全面)

事件选择的逻辑

函数
WSAEventSelect()
第一步
创建事件对象(变量)
函数
WSACreateEvent();
第二步
为每一个事件绑定一个socket以及操作accept、read、close并投递给操作系统, 相当于操作系统单开了一个线程, 我们不用管了:异步
可以模仿fd_set
函数
WSAEventSelect();
第三步
查看事件是否有信号
函数
WSAWaitForMultipleEvents();
第四步
有信号的话就分类处理
函数
WSAEnumNetworkEvents();
事件
FD_WRITE:只在accept之后立即产生一次

优化思路:

有序处理
相对有序, 让大家再第一个循环都能得到处理
每次传递一个事件
增加事件列表
创建多线程、线程池
增加事件数量
一组上限由WSAWaitForMultipleEvents()决定, 无法变大
如果一个一个投递, 那么就可以变多了
或者一组一组投递

事件选择模型和select模型