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
+31-3Lines changed: 31 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,7 +25,34 @@ LP_THREAD_("thread_id", {
25
25
26
26
> Внутри обработчика точно так же можно обращаться к задаче через `thisTask` и делать всё то же самое, что с `LoopTicker` (остановить, исключить из loop, отправить-поймать событие и так далее).
27
27
28
-
Для управления потоком используются специальные макросы.
28
+
Для управления потоком используются специальные управляющие макросы:
29
+
30
+
```cpp
31
+
// начало и конец потока для создания вручную
32
+
LP_THREAD_BEGIN()
33
+
LP_THREAD_END()
34
+
35
+
// перезапустить поток (начать выполнение с начала)
36
+
LP_RESTART()
37
+
38
+
// выйти из потока и потом вернуться в эту точку
39
+
LP_EXIT()
40
+
41
+
// асинхронно ждать время в потоке, мс
42
+
LP_DELAY(ms)
43
+
44
+
// асинхронно ждать условия в потоке
45
+
LP_WAIT(cond)
46
+
47
+
// асинхронно ждать Looper-события в потоке
48
+
LP_WAIT_EVENT()
49
+
50
+
// ждать семафор
51
+
LP_SEM_WAIT(sem)
52
+
53
+
// освободить семафор
54
+
LP_SEM_SIGNAL(sem)
55
+
```
29
56
30
57
### Выход из потока
31
58
В любой момент можно покинуть поток и отдать выполнение другим потокам, на следующем круге диспетчера задач управление вернётся к потоку и продолжится после точки выхода. Полезно например если нужно "размазать" какие то долгие сложные вычисления по времени и выполнять в промежутках другие потоки:
@@ -114,10 +141,11 @@ LP_TIMER(1000, []() {
114
141
```
115
142
116
143
## Ограничения
117
-
Реализация потоков очень простая и лёгкая, поэтому есть ограничения. По сути все макросы ожидания создают метку перехода, а весь код находится внутри `switch`, это означает что:
144
+
Реализация потоков очень простая и лёгкая, поэтому есть ограничения. По сути все управляющие макросы создают метку перехода, а весь код находится внутри `switch`, это означает что:
118
145
- После макроса ожидания будет выход из функции без сохранения стека, т.е. объявленные выше локальные переменные потеряют значения
119
-
- Нельзя создавать внутри потока локальные переменные, которые "живут" между вызовами макросов ожидания
146
+
- Нельзя создавать внутри потока локальные переменные, которые "живут" между вызовами управляющих макросов
120
147
- Для создания "стека" используем статические переменные внутри функции
148
+
- Нельзя использовать управляющие макросы внутри `switch`
121
149
122
150
Например цикл с задержкой делать вот так **нельзя**:
0 commit comments