1.start_eventloop 模式(阻塞模式)

lacewing 路由模式_多线程


可以看出这是最符合完成端口模式,由数据驱动。如果没有数据则一直阻塞或者发生错误。

注意:start_eventloop 一次则调用GetQueuedCompletionStatus反过来来说,如果我们需要实现完成端口多线程模式,那么我们需要调用多次start_eventloop 。同时对应的退出事件我们也应该调用多次post_eventloop_exit

//成对出现,调用多少次start_eventloop,则调用多少次post_eventloop_exit
//eventpump->start_eventloop();
//eventpump->post_eventloop_exit();
start_eventloop 多线程实现
//启动完成端口的线程数量
SYSTEM_INFO si;
GetSystemInfo(&si);
int nProcessors = si.dwNumberOfProcessors*2;
HANDLE *phThread = new HANDLE[nProcessors];
for (int i = 0; i < nProcessors; ++i)
{
phThread[i] = CreateThread(NULL, 0, _work_thread, eventpump, 0, NULL);
}
//成对出现
//eventpump->start_eventloop();
//eventpump->post_eventloop_exit();
WaitForMultipleObjects(nProcessors, phThread, TRUE, INFINITE);

DWORD WINAPI _work_thread(LPVOID lparam)
{
#这里应该增加事件,通知退出的。demo忽略
lacewing::eventpump pump = (lacewing::eventpump)lparam;
pump->start_eventloop();
return 0;
}

2.tick 模式(获取当前拥有的所有数据,直至数据为空)

lacewing 路由模式_多线程_02


从源码看出,等待时间是0,如果没有数据则是TIMEOUT。如果有数据则会循环调用process,直至没有数据为止。

tick 多线程实现

参考start_eventloop,但是需要在线程里面while循环获取

DWORD WINAPI _work_thread(LPVOID lparam)
{
lacewing::eventpump pump = (lacewing::eventpump)lparam;
//pump->start_eventloop();
while (true)
{
pump->tick();
//等待时机不好确定,没有start_eventloop 好实用
Sleep(10);
}
return 0;
}

3.start_sleepy_ticking(tick的改良模式,由事件驱动)

lacewing 路由模式_完成端口_03

lacewing 路由模式_消息路由_04

当接收到tick事件的时候需要在on_tick_needed中进行数据获取

void on_tick_needed(lacewing::eventpump pump)
{
pump->tick();
}
start_sleepy_ticking多线程实现(不支持上述方式,只能外面入队列,然后多线程处理数据),

lacewing 路由模式_多线程_05