Created
July 31, 2014 10:52
-
-
Save kashmervil/ed15263b57012a3251bc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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