跳到正文
本頁目錄

協程指南

從LeviLamina 1.0.0開始,協程替代了Scheduler。

用法

  1. 引用頭文件
    C++
    #include "ll/api/chrono/GameChrono.h"
    #include "ll/api/coro/CoroTask.h"
  2. 在函數中調用ll::coro::keepThis,傳入返回值為ll::coro::CoroTask的lambda函數
  3. 在keepThis後調用launch或syncLaunch方法,後者會阻塞服務器線程,傳入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++
#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<> {
        for (int i = 0; i < 20; ++i) {
            co_await 20_tick;
            std::cout << "This is coro in server thread\n";
        }
        co_return;
    }).launch(ll::thread::ServerThreadExecutor::getDefault());
}

ThreadPoolExecutor

以下函數使用協程實現了在線程池中每秒輸出字符串到控制台1次,共計20次。

C++
#include "ll/api/chrono/GameChrono.h"
#include "ll/api/coro/CoroTask.h"
#include "ll/api/thread/ThreadPoolExecutor.h"

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