Насколько понял Вашу задачу. Задача заключается в том, чтобы использовать IUP с корутинами в Lua, чтобы интерфейс не блокировал основной поток выполнения программы, а позволял продолжать выполнение других операций в программе, пока окно IUP остаётся открытым. Возможно этот пример подойдет, нужно проверять, но разобраться поможет. Удачи.
Код |
---|
require "iuplua"
-- Указываем глобальный атрибут для работы с корутинами
iup.SetGlobal("IUPLUA_THREADED", "YES")
-- Функция для создания диалога с текстовым полем
function create_input_dialog()
local text = iup.text{expand = "HORIZONTAL", value = ""}
local ok_btn = iup.button{title = "OK", size = "50"}
local cancel_btn = iup.button{title = "Cancel", size = "50"}
local dlg = iup.dialog{
iup.vbox{
iup.label{title = "Введите текст:"},
text,
iup.hbox{ok_btn, cancel_btn}
},
title = "Ввод данных",
size = "300x100"
}
return dlg, text, ok_btn, cancel_btn
end
-- Функция для асинхронного ввода через корутину
function async_input(coroutine_fn)
return function(...)
local co = coroutine.create(coroutine_fn)
local success, result = coroutine.resume(co, ...)
return result
end
end
-- Основная функция диалога как корутина
function input_dialog_coroutine()
local dlg, text, ok_btn, cancel_btn = create_input_dialog()
-- Создаем promise-like объект для синхронизации
local result = { waiting = true, value = nil }
-- Callback для OK
ok_btn.action = function()
result.value = text.value
result.waiting = false
return iup.CLOSE
end
-- Callback для Cancel
cancel_btn.action = function()
result.value = nil
result.waiting = false
return iup.CLOSE
end
-- Показываем диалог (не модальный!)
dlg:show()
-- Ждем завершения в цикле (можно заменить на более изящное решение)
while result.waiting do
coroutine.yield() -- Отдаем управление обратно
iup.LoopStep() -- Обрабатываем события IUP
end
dlg:destroy()
return result.value
end
-- Пример использования в основном потоке Quik
function main()
print("Начало работы скрипта")
-- Запускаем диалог в корутине
local co = coroutine.create(input_dialog_coroutine)
-- Основной цикл обработки
local timer = os.clock()
while coroutine.status(co) ~= "dead" do
-- Периодически возобновляем корутину
if os.clock() - timer > 0.1 then -- каждые 100 мс
local success, input_text = coroutine.resume(co)
if success and input_text then
print("Пользователь ввел: " .. input_text)
break
elseif not success then
print("Ошибка в корутине:", input_text)
break
end
timer = os.clock()
end
-- Здесь может выполняться другой код
-- Например, обработка данных из Quik
process_quik_data()
-- Небольшая пауза чтобы не грузить CPU
os.execute("ping -n 1 127.0.0.1 > nul") -- для Windows
-- os.execute("sleep 0.1") -- для Linux
end
print("Скрипт продолжает работу после диалога")
end
function process_quik_data()
-- Здесь может быть код для работы с данными Quik
-- который выполняется параллельно с открытым диалогом
end
-- Запуск основной функции
main()
|