跳转至

协程指南

从LeviLamina 1.0.0开始,协程替代了Scheduler。

用法

  1. 引用头文件
    C++
    1
    2
    #include "ll/api/chrono/GameChrono.h"
    #include "ll/api/coro/CoroTask.h"
    
  2. 在函数中调用ll::coro::keepThis,传入返回值为ll::coro::CoroTask的lambda函数
  3. keepThis后调用launchsyncLaunch方法,后者会阻塞服务器线程,传入Executor类,比如 ll::thread::ServerThreadExecutor

可用的Executor

ll::thread::ServerThreadExecutor(ll/api/thread/ServerThreadExecutor.h): 服务器线程 ll::thread::ThreadPoolExecutor(ll/api/thread/ThreadPoolExecutor.h): 线程池
更多Executor请参见ll/api/thread/

示例

ServerThreadExecutor

以下函数使用协程实现了在服务器线程每20 tick输出字符串到控制台1次,共计20次。

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include "ll/api/chrono/GameChrono.h"
#include "ll/api/coro/CoroTask.h"
#include "ll/api/thread/ServerThreadExecutor.h"

void createServerThreadCoro() {
    using namespace ll::chrono_literals;
    ll::coro::keepThis([]() -> ll::coro::CoroTask<> {
        co_await 20_tick;
        static int i = 0;
        while (i < 20) {
            std::cout << "This is coro in server thread\n";
            ++i;
        }
        co_return;
    }).launch(ll::thread::ServerThreadExecutor::getDefault());
}

ThreadPoolExecutor

以下函数使用协程实现了在线程池中每秒输出字符串到控制台1次,共计20次。

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include "ll/api/chrono/GameChrono.h"
#include "ll/api/coro/CoroTask.h"
#include "ll/api/thread/ThreadPoolExecutor.h"

void createServerThreadCoro() {
    using namespace ll::chrono_literals;
    ll::coro::keepThis([]() -> ll::coro::CoroTask<> {
        co_await 1s;
        static int i = 0;
        while (i < 20) {
            std::cout << "This is coro in server thread\n";
            ++i;
        }
        co_return;
    }).launch(ll::thread::ThreadPoolExecutor::getDefault());
}