Skip to content

Instantly share code, notes, and snippets.

@kashmervil
Created July 31, 2014 10:52
Show Gist options
  • Save kashmervil/ed15263b57012a3251bc to your computer and use it in GitHub Desktop.
Save kashmervil/ed15263b57012a3251bc to your computer and use it in GitHub Desktop.
open Trik
open Trik.Junior
open Trik.Junior.Parallel
//Вопрос 1
//Какое название для главной сущности выбрать? Успели ли они привыкнуть к брику?
//из вариантов: robot или brick
printfn "Starting"
//Вопрос 2
// Как лучше организовать работу с устройствами, в котороые нужно писать?
// (Моторы, сервы, всякие лампочки). Можно сделать как в примере
// robot."Название устройства" <- "Какое-то значение" -- умные проперти, которые делают всё, что нужно
// или сделать методы (setColor, setPower) для каждого устройства?
let flicker = task { for i=1 to 100 do
for color in [LedColor.Green; LedColor.Orange; LedColor.Red] do
robot.Led <- color// Оставить вот так?
//robot.Led.SetColor(color) или
//robot.SetLedColor(color)
robot.Sleep(500)
}
let k = 3 // some coefficient
let drive = task { while true do
let u = k * (robot.SensorA2 - 500) / 10
robot.MotorM1 <- 70 + u
robot.MotorM2 <- 70 - u
//robot.MotorM1.SetPower(70 + u) -- возможные варианты, может быть есть что-то ещё лучше
//robot.SetM1Power(70 + u) -- хочется сделать работу с устройствами максимально удобной
if robot.SensorA1 > 600 then
do! BREAK
robot.Sleep(300)
done
}
//Вопрос 3
// Как лучше называть все устройства на роботе?
// По названию порта
// robot.A1 -- аналогсенсор из порта A1
// robot.M1 -- силовой мотор из портв М1
// По названию устройства и порта
// robot.MotorM1
// robot.SensorA2
printfn "Executing"
//Вопрос 4
// Какие названия лучше выбрать для методов запуска параллельных вычислений?
// Если ли для этого какие-то устоявшиеся обозначения?
// Как подобные проблемы решаются во всяких Лего или других робототехнических библиотеках
flicker.Execute() //? Этот метод не ждет завершения задачи, а просто стартует выполнение
drive.StartAndWait()//Этот стартует и ждет
// Было бы здорово, если бы эти названия были связаны друг с другом
//Вопрос 5
// Как удобнее организовывать работу с несколькими задачами?
// Сейчас общий паттерн такой: Мы создаем несколько задач через task { ... }
// let task1 = task { ... }
// let task2 = task { ... }
// ... ... ...
// let taskN = task { ... }
// Какие-то из них могут быть внутри бесконечных циклов, какие-то могут отрабатывать очень быстро.
// Все эти задачи ещё не запущенны. Для запуска нужно сказать каким-то задачам Execute
// и одной -- StartAndWait, чтобы что-то блокировало основную ветку приложения и оно не заканчивалось.
// Ясное дело, что выбирать нужно задачу, которая закончится (не голый while true),
// но при этом будет не самой короткой, потому что когда она закончится,
// все остальные задачи просто закроются, потому что будет достигнут конец программы.
//
// task1.Execute()
// task2.Execute()
// task13.Execute()
// task8.StartAndWait() -- все четыре задачи будут выполняться параллельно, при это якорем будет восьмая
// task6.Execute() -- Сюда программа доберется только тогда, когда восьмая задача завершится
// task9.StartAndWait() -- 1, 2, 13 -- могли и не завершится и продолжат своё выполнение дальше походу программы.
// Только теперь к ним подключится 6-я и всё это будет ждать конца 9-й
// Какие минусы могут быть у так организации?
// Вопрос 6
// Стоит ли ввести оператор для группировки задач?
// Например
// let task1 = task { ... }
// let task2 = task { ... }
// ... ... ...
// let taskN = task { ... }
// let groupedTask = task1 <+> task2 <+> task9 -- будет реализовывать аналогичные методы для работы, что и обычные таски
// А завершаться с последней в группе
// let anotherGroup = groupedTask <+> task8
// groupedTask.Execute()
// task99.Execute()
// task12.Execute()
// groupedTask.StartAndWait()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment