В продолжении темы асинхронности, собрал не большой пример для себя, такую "напоминалочку" Вот код:
Код |
---|
-- 1) Запуск программы main в потоке терминала QUIK
-- 2) Запуск сопрограммы в потоке терминала main
local working = true -- Флаг для продолжения цикла
function Robot()
local events = {} -- Таблица для хранения событий
local routine = coroutine.create(function()-- Создание сопрограммы для отслеживания событий
while working do -- Отслеживание событий и создание итераций
-- ... (реализация отслеживания событий)
local conect = coroutine.create(function()-- реализация отслеживания события соединения с сервером
while working do
local event_conect = math.random(1,10) -- print("event_conect",event_conect)
-- Добавление события в таблицу
--table.insert(events, { event }) -- Добавляем данные события
-- Если соединение установлено делаю Паузу до следующей итерации, Если нет соединение ждем.
if event_conect >= 5 then coroutine.yield() else print("No conect?",event_conect) end
end
end)
coroutine.resume(conect)
-- ... (реализация отслеживания событий)
local WorkTime = coroutine.create(function()-- реализация отслеживания события Рабочего времени
while working do
local event_WorkTime = math.random(1,10)
--print("event_WorkTime",event_WorkTime)
-- Добавление события в таблицу
--table.insert(events, { event }) -- Добавляем данные события
-- Пауза для отслеживания новых событий
if event_conect >= 5 then coroutine.yield() else print("No WorkTime?",event_conect) end
end
end)
coroutine.resume(WorkTime)
-- реализация создания итераций для получения рыночной информации и ее обработки
local event = math.random(1,10) print("event",event)
-- Добавление события в таблицу
table.insert(events, { event }) -- Добавляем данные события
-- Пауза для отслеживания новых рыночных событий
coroutine.yield()
end
end)
-- Запуск сопрограммы coroutine.resume(routine)
while working do -- Главный цикл для обработки событий (поток main)
coroutine.resume(routine)-- Заход в сопрограмму для отслеживания событий
if coroutine.status(routine) == "dead" then -- Проверка статуса сопрограммы
print("Robot routine finished")
break
end
for _, event in ipairs(events) do-- Обработка событий из таблицы
-- ... (реализация обработки событий)
print("event",event[#event],#event)
if event[#event] >= 5 then print("Buy") else print("Sell") end
end
events = {} -- Очистка таблицы событий
-- Заход в сопрограмму для дальнейшего отслеживания событий
--coroutine.resume(routine)
end
working = false
end |
Пример рабочий для этого добавлены случайные входа - это просто некий макет. Запуск функции Robot - print( Robot() ) в среде луа, запустит бесконечный цикл имитируя работу сопрограммы в потоке main() запущенного в терминала QUIK. В чем смысл данного примера: Можно просто в main() написать логику работы программы и последовательно исполнять код. Данный код демонстрирует асинхронный подход к воспроизведению кода программы. Сопрограмма запускается до основного цикла main() выполняется необходимая работа идет приостановка, выполняется работа в цикле main() по окончании идет возврат в сопрограмму, добавлены для примера еще 2 ниточки отслеживающие соединение и рабочее время для примера. Хотел подробней описать, но смысла особого нет, сложно просто без запуска разобраться. Кому интересен подход запустит, и где нужно добавит комментариев. Почему это лучше лучше почитать букварь. Всем хорошего кода.