You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/2.threads.md
+25-11Lines changed: 25 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,12 +25,26 @@ LP_THREAD_("thread_id", {
25
25
26
26
> Внутри обработчика точно так же можно обращаться к задаче через `thisTask` и делать всё то же самое, что с `LoopTicker` (остановить, исключить из loop, отправить-поймать событие и так далее).
27
27
28
+
Для управления потоком используются специальные макросы.
29
+
30
+
### Выход из потока
31
+
В любой момент можно покинуть поток и отдать выполнение другим потокам, на следующем круге диспетчера задач управление вернётся к потоку и продолжится после точки выхода. Полезно например если нужно "размазать" какие то долгие сложные вычисления по времени и выполнять в промежутках другие потоки:
32
+
33
+
```cpp
34
+
LP_THREAD({
35
+
Serial.println("test 1");
36
+
LP_EXIT();
37
+
Serial.println("test 2");
38
+
LP_EXIT();
39
+
});
40
+
```
41
+
28
42
### Ожидание времени
29
43
Поток может асинхронно ждать указанное время, это ожидание **не блокирует выполнение программы**:
30
44
31
45
```cpp
32
46
LP_THREAD({
33
-
LP_SLEEP(500);
47
+
LP_DELAY(500);
34
48
Serial.println("test!");
35
49
});
36
50
```
@@ -40,9 +54,9 @@ LP_THREAD({
40
54
```cpp
41
55
LP_THREAD({
42
56
digitalWrite(LED_BUILTIN, 1);
43
-
LP_SLEEP(500);
57
+
LP_DELAY(500);
44
58
digitalWrite(LED_BUILTIN, 0);
45
-
LP_SLEEP(500);
59
+
LP_DELAY(500);
46
60
});
47
61
```
48
62
@@ -54,9 +68,9 @@ LP_THREAD({
54
68
55
69
while (true) {
56
70
digitalWrite(LED_BUILTIN, 1);
57
-
LP_SLEEP(500);
71
+
LP_DELAY(500);
58
72
digitalWrite(LED_BUILTIN, 0);
59
-
LP_SLEEP(500);
73
+
LP_DELAY(500);
60
74
}
61
75
});
62
76
```
@@ -89,7 +103,7 @@ LP_THREAD_("thread", {
89
103
90
104
// отправляем событие по таймеру
91
105
LP_THREAD({
92
-
LP_SLEEP(2000);
106
+
LP_DELAY(2000);
93
107
Looper.pushEvent("thread");
94
108
});
95
109
@@ -110,7 +124,7 @@ LP_TIMER(1000, []() {
110
124
LP_THREAD({
111
125
for (int i = 0; i < 10; i++) {
112
126
Serial.println(i);
113
-
LP_SLEEP(500);
127
+
LP_DELAY(500);
114
128
// тут мы выйдем из функции и потеряем значение i
115
129
}
116
130
});
@@ -124,7 +138,7 @@ LP_THREAD({
124
138
125
139
for (i = 0; i < 10; i++) {
126
140
Serial.println(i);
127
-
LP_SLEEP(500);
141
+
LP_DELAY(500);
128
142
}
129
143
});
130
144
```
@@ -150,7 +164,7 @@ LP_THREAD({
150
164
// тут мы забираем семафор себе, другие потоки будут заблокированы
0 commit comments