tools
読み取り中…
検索中…
一致する文字列を見つけられません
thread.h
[詳解]
1#pragma once
2#include <thread>
3#include <tuple>
4#include <utility>
5#include <atomic>
6#include <yy981/time.h>
7
8/**
9 * @file thread.h
10 * @brief 繰り返し実行スレッドクラス
11 *
12 * 指定した関数を一定間隔または連続でループ実行するデタッチスレッドを
13 * RAII スタイルで管理します。
14 */
15
16/**
17 * @class dthread
18 * @brief デタッチされた繰り返し実行スレッドを管理するクラス
19 *
20 * コンストラクタでスレッドを起動し、デストラクタ(または stop())で停止します。
21 * スレッドはデタッチされているため、インスタンスが破棄されてもスレッドは
22 * running フラグが false になるまで動き続けます。
23 *
24 * @code
25 * // 500ms ごとに関数を実行
26 * dthread dt(tu::l, 500.0, []{ std::cout << "tick\n"; });
27 * std::this_thread::sleep_for(std::chrono::seconds(3));
28 * dt.stop();
29 * @endcode
30 */
31class dthread {
32public:
33 /**
34 * @brief 一定間隔でループ実行するスレッドを起動するコンストラクタ
35 * @tparam Func 実行する関数の型
36 * @tparam Args 関数に渡す引数の型(パック)
37 * @param unit スリープの時間単位(tu 列挙型)
38 * @param value スリープの時間値
39 * @param func 繰り返し実行する関数
40 * @param args func に渡す引数
41 */
42 template <typename Func, typename... Args>
43 dthread(tu unit, double value, Func&& func, Args&&... args) {
44 if (running) stop();
45 running=true;
46 std::thread([this, unit, value, func = std::forward<Func>(func), args = std::make_tuple(std::forward<Args>(args)...)]() mutable {
47 while (running) {
48 std::apply(func, args);
49 sleepc(unit,value);
50 }
51 }).detach();
52 }
53
54 /**
55 * @brief スリープなしで連続ループ実行するスレッドを起動するコンストラクタ
56 * @tparam Func 実行する関数の型
57 * @tparam Args 関数に渡す引数の型(パック)
58 * @param noSleep スリープなしフラグ(値は無視、オーバーロード解決用)
59 * @param func 繰り返し実行する関数
60 * @param args func に渡す引数
61 */
62 template <typename Func, typename... Args>
63 dthread(bool noSleep, Func&& func, Args&&... args) {
64 if (running) stop();
65 running=true;
66 std::thread([this, func = std::forward<Func>(func), args = std::make_tuple(std::forward<Args>(args)...)]() mutable {
67 while (running) {
68 std::apply(func, args);
69 }
70 }).detach();
71 }
72
73 /**
74 * @brief デストラクタ。スレッドのループを停止する
75 */
76 ~dthread() {running=false;}
77
78 /**
79 * @brief スレッドのループを手動で停止する
80 */
81 inline void stop() {running=false;}
82
83 /**
84 * @brief スレッドが実行中かどうかを返す
85 * @return スレッドが実行中なら true
86 */
87 operator bool() {
88 return running;
89 }
90
91private:
92 /// @brief スレッドの実行状態フラグ(アトミック)
93 std::atomic<bool> running{false};
94};
dthread(bool noSleep, Func &&func, Args &&... args)
スリープなしで連続ループ実行するスレッドを起動するコンストラクタ
Definition thread.h:63
~dthread()
デストラクタ。スレッドのループを停止する
Definition thread.h:76
void stop()
スレッドのループを手動で停止する
Definition thread.h:81
dthread(tu unit, double value, Func &&func, Args &&... args)
一定間隔でループ実行するスレッドを起動するコンストラクタ
Definition thread.h:43
時刻・時間ユーティリティ
void sleepc(tu unit, double value)
指定した時間単位でスレッドをスリープさせる
Definition time.h:42
tu
時間単位を表す列挙型
Definition time.h:24