Тема: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua
В терминале QUIK версии 6.15.0 в Lua добавлена новая функция: PrintDbgStr.
Описание в справке про неё крайне скудное, поэтому здесь расскажу подробнее. ([url=http://forum-archive.quik.ru/forum/lua/122050/]пруф[/url])
Теория
Исключительно для справки:
В основе лежит вызов WinAPI функции OutputDebugString. Описание как она устроена и как её использовать есть [url=http://msdn.microsoft.com/ru-ru/library/windows/desktop/aa363362%28v=vs.85%29.aspx]в MSDN[/url] и [url=http://www.unixwiz.net/techtips/outputdebugstring.html]не только[/url].
Кратко суть её работы в том, что при вызове эта функция ищет есть ли в системе зарегистрированная "программа-ловушка" сообщений, отправленных через OutputDebugString. Если такая программа есть - ей отправляется сообщение - и ваш скрипт продолжает работать. Что далее делать с полученным сообщением - зависит от функционала программы-"ловушки". Если никакой подобной программы нет - вызов OutputDebugString ничего не делает.
Хорошо в этой функции то, что если её вывод никто "не ловит" - то работает она очень быстро, практически не задерживая работу вашей программы. Это позволяет оставлять вывод отладочной информации даже в готовой программе. (Запустив просмотрщик, с удивлением увидел выводимые некоторыми программами явно отладочные сообщения.)
Хорошо то, что наблюдать отладочный вывод можно даже подключившись с другого компьютера.
Условно-плохо то, что эта функция не годится для логирования: если в момент её вызова в системе нет "приёмника сообщений" - то выведенные сообщения нигде не сохранятся.
Практика
На самом деле использовать эту функцию очень просто. Вызывая из Lua-скрипта в QUIK функцию PrintDbgStr("строка"), мы получаем отправку отладочного сообщения, т.е. того текста, который в неё передали.
Надо отметить сразу, что выводимые сообщения не пишутся ни в какой файл. Чтобы их увидеть - необходима какая-нибудь специальная программа. Например, средства просмотра такого отладочного вывода содержатся во многих популярных отладчиках.
Но мы возьмём программу намного проще и удобнее: DebugView от Марка Русиновича. [url=http://technet.microsoft.com/en-us/sysinternals/bb896647]Скачать DebugView[/url] можно совершенно бесплатно.
Для примера сделаем простой скрипт:
PrintDbgStr("Start: [" .. getScriptPath() .. "]")
is_run = true
function main()
while is_run do
sleep(1000)
PrintDbgStr("main() Time:" .. os.date("%H:%M:%S"))
end
end
function OnStop()
PrintDbgStr("onStop()")
is_run = false
end
Запустим программу DebugView и вот что мы в ней увидим:
Чтобы в столбце Time видеть время в нормальном виде - нужно в меню Options включить пункт Clock time.
Причем строки будут появляться прямо "в on-line режиме" во время работы скрипта.
Может оказаться, что в окне DebugView мы увидим не только отправленные нами сообщения, но и отладочные сообщения от других программам. Так что есть смысл отфильтровать строки по PID интересующего нас процесса info.exe.
Индикаторы на Lua
Когда QUIK подгружает индикаторы на Lua, расположенные в папке LuaIndicators, то в случае ошибок выполнения скрипта индикатора в момент его загрузки информация о такой ошибке выводится терминалом через PrintDbgStr.
Таким образом, если вы написали скрипт индикатора, но ваш индикатор не появляется в списке доступных - то, скорее всего, в скрипте есть какая-то синтаксическая ошибка. Посмотреть ошибку можно описанным выше способом.
Немного про настройки вывода
...позже...