メインコンテンツまでスキップ

co_await で非同期

c++20 の coroutine うまくいきそう。

あらためて coroutine による task async await 的なものを試してみたところ、 libuv とうまく組み合わせることができそうです。

keymap から coroutine を開始する

promise void と awaiter void

再起

awaiter T と promise T

ついに動いた

試行錯誤して粘っていたらうまくいった。 suspend せずに即座に処理される場合にもきちんと対応する必要があった。 awaiter が作られるときにはすでに処理が終っているのに終了待ちをしてしまい、 後続が resume されない。 この場合は suspend しないことと、 awaiter 生成時に値を付与する。

あと、final_suspend で処理を止めて、あとで resume することで 資源をクリアする手法。

trait で R::promise_type 以外を promise 型に指定するのもよい。

keymap 関数のシグネチャーが以下のようになって、 中で co_await が可能になった。

using Func = std::function<std::shared_ptr<CoroutineState<void>>()>;

ロード中のタブ切り替えや、 lineeditor が modal dialog 的に await するなどができる予定。