1

Тема: Библиотеки визуальных элементов GUI в QLua

Есть предложение поделиться наработками по поводу подключения и использования библиотек визуальных элементов в QLUA.

Начну с себя.
Как известно, разработчики приводят в документации пример таблички, говорят, что сделана на wxLua.
Я пробовал подключить ее и использовать, но пока это не особо увенчалось успехом.

Например, возьмем простейший пример из поставки wxLua под названием veryminimal.wx.lua. Замечу, что в нем содержится функция main(), которая в QLUA является обработчиком события с предопределенным названием, поэтому весь полезный код вынесем за пределы этой функции пока, вставим лишь пустую main() чтобы QLUA не ругался. В итоге выкинув все лишнее (комментарии вначале и заполнение package.cpath) получаем:

require("wx")

message("Start", 1)

frame = wx.wxFrame( wx.NULL, wx.wxID_ANY, "wxLua Very Minimal Demo",
                    wx.wxDefaultPosition, wx.wxSize(450, 450),
                    wx.wxDEFAULT_FRAME_STYLE )

frame:Show(true)

wx.wxGetApp():MainLoop()

message("End", 1)

--------
function main()
end

Если этот текст сохранить в файл и запустить, то получим открывшееся окно, созданное средствами wxLua! Вроде все здорово, и терминал Quik даже работает. Однако, если посмотреть внимательнее, по выясняется:
а) Сообщения "End" нет, выведено только "Start"
б) Напротив скрипта стоит признак "остановлен" (красный квадрат), хотя наше окно открыто и функционирует.
в) Ни один обработчик скрипта LUA не работает (если его дописать, например, onAllTrade).

Если окно закрыть - увидим сообщение "End". Выходит, скрипт наш стоял на строке

wx.wxGetApp():MainLoop()

и дальше не шел, что очень грустно.

Как же работал при этом терминал QUIK?? очевидно, внутри MainLoop() содержится цикл обработки сообщений, который вполне устраивает QUIK (во всяком случае я не нашел проблем).

Если убрать строку

wx.wxGetApp():MainLoop()

и дополнить функцию main() стандартным ожиданием остановки скрипта - терминал QUIK и вовсе зависает или что-нибудь в этом роде. Т.е. стандартный QUIK'овский обрабтчик сообщений почему-то для wxLua не подходит.

Хорошо, а что если всю эту фтуковину убрать в main(), где она вроде мешать не будет? просто скопировать в нее весь код да и все, раз уж выхода из него не происходит, пока окно не закроешь?

require("wx")

function main()
  message("Start", 1)

  frame = wx.wxFrame( wx.NULL, wx.wxID_ANY, "wxLua Very Minimal Demo",
                      wx.wxDefaultPosition, wx.wxSize(450, 450),
                      wx.wxDEFAULT_FRAME_STYLE )

  frame:Show(true)

  wx.wxGetApp():MainLoop()

  message("End", 1)
end

На первый взгляд все хорошо: окно появляется, скрипт во состоянии "работает", терминал живет. Закрываем окно, скрипт останавливается. Вроде все замечательно, но при повторном запуске скрипта терминал QUIK весь падает с Internal error.

Что еще придумать - не знаю. Есть ли у кого-нибудь идеи?

2

Re: Библиотеки визуальных элементов GUI в QLua

Я делал бесконечный цикл с задержкой в теле main()

while 1 do
sleep(100)
end

3 (2012-12-25 21:52:43 отредактировано swerg)

Re: Библиотеки визуальных элементов GUI в QLua

boris,
но тогда скрипт никогда корректно не завершит работу, верно?

Собственно проблема как раз в том, чтобы скрипт корректно запускался повторно. Т.к. одн раз он запусакается без проблем, а вот повторно - уже увы.

Вот здесь я задал вопрос разработчикам с описанием простейшего примера работы с wxLua, где точно создается 1 поток в QUIK для LUA-обработчиков, и сравнил с выполнением того же скрипта вызовом LUA из стандартной поставки.
На мой взгляд описанный эксперимент красноречиво говорит  о том, что при подключении сторонних dll-файлов к QLUA наблюдаются какие-то проблемы, которые явно связаны с самим QLUA-плагином к Quik, а не со сторонней библиотекой.
Подождем ответ.