Модифицированный sleep()

Опубликовано в QLua

-- Исполняет задержку в all миллисекунд, проверяя каждые quant миллисекунд значение функции func
-- Если результат func() ~= nil / false, задержка прерывается
-- Если выход был по func(), возвращает ее результат, если истекло время ожидания - nil
function quik.sleep(all,quant,func)       for _ = quant,all,quant do
         local result = func()
         if result then
            return result
         end
      sleep(quant)
   end
end

Пример использования. Ожидание исполнения отправленной на сервер транзакции. Колбек OnTransReply все входящие ответы сервера складывает в массив (таблицу) ontransreply_table. Мы ждем максимум 30 секунд и проверяем каждые 50 миллисекунд появление в таблице ontransreply_table ответа на транзакцию с нужным нам trans_id. В результате в переменной reply будет нужный нам ответ торговой системы на транзакцию или nil, если не дождались.

-- Поиск в таблице lua
-- TBL - таблица для поиска
-- FUNC - функция сравнения с одним параметром, в который передается значение элемента таблицы. Должна возвращать true в случае совпадения
-- Возвращает ключ и значение первого найденного результата (или nil/nil при неудаче)
function table.find(tbl,func)
   for key,value in pairs(tbl) do
      if func(value) then
         return key,value
      end
   end
end
local _,reply
quik.sleep(30000,
50,
function()
      _,reply = table.find(ontransreply_table,
            function (t)
                return t.trans_id == tonumber(trans_id)
            end)
return reply
    end)

Недостаточно прав для комментирования

Архив QLua