00014. Редактирование main.scm. Потоки и опкоды (Часть 2)

Редактирование main.scm. Потоки и опкоды (Часть 2)|В этом уроке мы продолжим изучать потоки. Урок посвящен запуску нескольких потоков и описаны правила переходов между ними.|wmysterio|wmysterio||||Итак запускать поток мы научились. Давайте научимся запускать несколько потоков одновременно! В CLEO такой возможности нет ( есть аналоги, но сейчас не о этом ), поэтому я вас учу сначала редактировать именно "main.scm". Но ближе к делу. Все потоки запускаются, как уже было сказано с помощью команды create_thread. Теперь в работающем потоке пишем несколько таких команд:

// ...
create_thread @POTOK
create_thread @POTOK_1
create_thread @POTOK_2
end_thread 

:POTOK
thread 'POTOK'
wait 0 
jump @POTOK_5

:POTOK_5
wait 0
end_thread

:POTOK_1
thread 'POTOK_1'
wait 0 
jump @POTOK_1_4

:POTOK_1_4
wait 0
end_thread

:POTOK_2
thread 'POTOK_2'
wait 0 
jump @POTOK_2_3

:POTOK_2_3
wait 0
end_thread 

Вот мы выполнили нашу задачу - запустили подряд три потока. Они будут выполнятся одновременно! Смысл в том, что мы "нанимаем" три наших знакомых шарика и они вкалывают на нас. Графически это можно описать так:

С рисунка видно, что работают 3 шарика. При этом потоки могут быть в разных местах, то есть если в начале мы напишем так:

create_thread @POTOK
create_thread @POTOK_3
create_thread @POTOK_2

то, работать они будут так же. Разницы нету.

× **ВАЖНО:** Все прыжки должны выполятся только в области своего потока! Это значит нельзя делать прыжки на метки, находящаяся в другом потоке.

Вот вам картинка:

Так что запомним: Шарик знает только себя, выполняет только свою работу. Остальные шарики ему по барабану, как и на их работу. Я бы сказал, что он имеет свою сферу влияния, которая действует только на том потоке, на котором его вызвали. Технически этот шарик к другим потокам обращаться не должен.

Но есть одна особенность в этом случае: если метка для прыжка находится в другом потоке, но от неё идёт комманда прыжка обратно в первый, то ошибки не будет! Вот картинка, что бы вы поняли о чём я:

Дело в том, что Sanny Builder автоматичеки распределяет сферы влияния, а в месте с ними и метки, которые ей принадлежат. Таким образом, метка "POTOK_1_4" автоматически отнесётся к потоку "POTOK", даже, если она находится в середине потока "POTOK_1".

× **ВАЖНО:** Вызывать одного и того же шарика можно много раз, но никак не одновременно. То есть, пока работает поток, вызывать его ещё раз нельзя!

Вот скрин:

Хоть и шарики могут вызываться подряд, но между вызовами есть крохотная задержка. А это значит, что если мы поменяем вызовы местами, то выйдет следующее:

Так что нужно быть внимательным при запуске потоков.

Думаю, Вы заметили, что в последних картинках, в потоке "POTOK_1" в место "end_thread" стоит "jump @POTOK_1". Это значит, что данный поток будет повторяться. Причём бесконечно! Но о бесконечности мы поговорим в следующих уроках.

В общем, если запускать потоки, которые будут работать одновременно, советую не делать "create_thread" с разных потоков, что бы избежать все возможных ошибок и глюков.|1467|1|0|74148405png1117552400197``\|50899820png934496400212\|97405113`png`406`516`393`500|90162325png379`457

`\|59927369`png`318`468

`||redaktirovanie_main_scm_potoki_i_opkody_chast_2|1498204687

Last updated