lacewing 路由模式

    xiaoxiao2022-07-13  136

    1.start_eventloop 模式(阻塞模式)

    可以看出这是最符合完成端口模式,由数据驱动。如果没有数据则一直阻塞或者发生错误。 注意: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 模式(获取当前拥有的所有数据,直至数据为空)

    从源码看出,等待时间是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的改良模式,由事件驱动)

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

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

    最新回复(0)