FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
task_runner.cpp
Go to the documentation of this file.
1// Copyright 2024 Arthur Sonzogni. All rights reserved.
2// このソースコードの使用は、LICENSE ファイルにある MIT ライセンスによって管理されています。
3//
5
6#include <cassert>
7#include <thread>
8
9namespace ftxui::task {
10
11static thread_local TaskRunner* current_task_runner = nullptr; // NOLINT
12
14 assert(!previous_task_runner_);
15 previous_task_runner_ = current_task_runner;
16 current_task_runner = this;
17}
18
20 current_task_runner = previous_task_runner_;
21}
22
23// static
25 assert(current_task_runner);
26 return current_task_runner;
27}
28
29auto TaskRunner::PostTask(Task task) -> void {
30 queue_.PostTask(PendingTask{std::move(task)});
31}
32
34 std::chrono::steady_clock::duration duration)
35 -> void {
36 queue_.PostTask(PendingTask{std::move(task), duration});
37}
38
39/// キュー内のタスクを実行します。
41 -> std::optional<std::chrono::steady_clock::duration> {
42 while (true) {
43 auto maybe_task = queue_.Get();
44 if (std::holds_alternative<std::monostate>(maybe_task)) {
45 // 実行するタスクがこれ以上ないため、ループを終了します。
46 return std::nullopt;
47 }
48
49 if (std::holds_alternative<Task>(maybe_task)) {
50 executed_tasks_++;
51 std::get<Task>(maybe_task)();
52 continue;
53 }
54
55 if (std::holds_alternative<std::chrono::steady_clock::duration>(
56 maybe_task)) {
57 return std::get<std::chrono::steady_clock::duration>(maybe_task);
58 }
59 }
60}
61
62auto TaskRunner::Run() -> void {
63 while (true) {
64 auto duration = RunUntilIdle();
65 if (!duration) {
66 // 実行するタスクがこれ以上ないため、ループを終了します。
67 return;
68 }
69
70 // 次のタスクが実行されるまで、指定された期間スリープします。
71 std::this_thread::sleep_for(duration.value());
72 }
73}
74
75} // namespace ftxui::task
static auto Current() -> TaskRunner *
auto PostTask(Task task) -> void
タスクを即座に実行するようにスケジュールします。
auto RunUntilIdle() -> std::optional< std::chrono::steady_clock::duration >
キュー内のタスクを実行し、次の遅延タスクが実行されるまでの遅延を返します。
auto PostDelayedTask(Task task, std::chrono::steady_clock::duration duration) -> void
特定の期間の後に実行されるようにタスクをスケジュールします。
std::function< void()> Task
タスクは作業の単位を表します。
PendingTaskは、特定の時刻に、または可能な限り早く実行されるようにスケジュールされたタスクを表します。