sav 312, Возможно терминал чем-то нагружен? К сожалению у нас догадки кончились. Проблема не воспроизводится.
Изначально же, суть в том что в терминале окна перерисовываются раз в 50мс. И если скриптом обновлять таблицу чаще, то она не успевает обновляться, в результате происходит эффект заморозки. Лечится это как уже говорили другие пользователи принудительной перерисовкой окна, либо увеличением sleep до значений больше 50.
Нет ничего лишнего. Один инструмент и один график. Скрипт тоже один.
Цитата
Sergey Gorokhov написал: Лечится это как уже говорили другие пользователи принудительной перерисовкой окна
Это вариант работает, только окно постоянно активно и соответственно невозможно сделать активными другие окна.
Цитата
Sergey Gorokhov написал: увеличением sleep до значений больше 50
Блин, ставил и 100 и 200 - в моем случае нет результата. В данный момент выделяю 2 строки поочередно и все обновляется каждый тик. Мигание правда достает, а так результат достигнут. Да и забыл сказать стоит в main добавить строку обращения к графику по идентификатору т.е. чуть подгружаем скрипт и все сразу работает. Почему со sleep не прокатывает сам не пойму.
Sergey Gorokhov написал: Изначально же, суть в том что в терминале окна перерисовываются раз в 50мс.
Вот так если не окончательно понятно, то во всяком случае более-менее. У меня проблема воспроизводится как раз при слипе меньше 50. 45 еще нифига не работает, 50 уже более-менее тикает (иногда дергается). Квик свежий джуниор отсюда. Или вы это раньше не писали или я пропустил )) Видимо из этой цифры и придется исходить. Приемлимых способов форсировать перерисовку окна я не вижу, на системные пинки от винды оно точно так же не реагирует.
Возникает мысль обновлять таблицы которые необходимо отображать на экране например 1 раз в 20 тиков, человек же все равно не разглядит быстрее. А то что нужно для работы роботу держать в другой таблице. Тоже костыль но он хотя-бы не будет много дополнительных ресурсов гонять.
Мне вот интересно с чего возникало предположение что вообще может работать. Отображением заголовка окна разве сам оконный класс "заведует"? Я разумеется исходников не видел и не могу знать точно. Но могу подтвердить что у меня тоже SetWindowCaption абсолютно ничего не дает.
Цитата
Sergey Gorokhov написал: Изначально же, суть в том что в терминале окна перерисовываются раз в 50мс.
Еще такой к вам вопрос. Допустим я то что должно отображаться буду обновлять 2 раза в секунду, моему человеческому восприятию чаще и незачем. Судя по обсуждению можно считать что точно обновится, так?
Дошло на 3й час ))) Если тема темная то заголовки действительно рисует оконный класс и SetWindowCaption действительно форсирует отрисовку А если тема стандартная то заголовки в компетенции венды и все как обычно.
Ну может кому-то будет полезно, мне лично темная тема просто не нравится. Но будем знать.
BlackBoar написал: Допустим я то что должно отображаться буду обновлять 2 раза в секунду, моему человеческому восприятию чаще и незачем. Судя по обсуждению можно считать что точно обновится, так?
Да верно.
Цитата
BlackBoar написал: Если тема темная то заголовки действительно рисует оконный класс и SetWindowCaption действительно форсирует отрисовкуА если тема стандартная то заголовки в компетенции венды и все как обычно.
Вы правы, скрипт тестировался на темной теме.
Цитата
sav 312 написал: На другом компе со sleep 100 работает, а с SetWindowCaption также нет.
С SetWindowCaption разобрались, см выше. А вот что делать со sleep, к сожалению затруднимся что либо порекомендовать. Пока только ясно что проблема локальная и связана с конкретным компьютером, скорей всего с процессором. Но что это может быть, к сожалению идей нет.
На версии 8.6 в темной теме обновление окна скрипта происходит корректно при задержке 55 мс. и выше. А в вот в светлой теме не помогает даже задержка 100 мс и выше. Окно обновлется только если его "подергать".
Приходится сидеть на темной теме, что некомфортно.
Правильно понимаем, что под "окно скрипта" - имеется ввиду таблица в рабочем месте, которая строится при помощи lua-скрипта? Если так - то просьба уточнить, каким именно образом отслеживаете/задаёт время обновления, каким образом выполняете обновление таблицы? Если возможно - просьба привести минимальный и достаточный для воспроизведения фрагмент скрипта, который бы позволял эффективно воспроизвести описываемое поведение.
Вот простейший код. Он уже приводился в этой ветке. Добавил вывод анимации для более наглядного представления.
При использовании темной темы все более менее плавно. Светлая - замирания окна таблицы.
Причем видно, что это происходит при подсвечивании ячейки таблицы.
Относительно помогает сгладить замирания - увеличение периода подсветки до 1000 мс.
Но в темной теме все плавно для 500 мс и 60 мс задержки основного цикла.
Код
local sec_code = 'SRU0'
local class_code = 'SPBFUT'
local sleep = _G.sleep
local isRun = true
local t_id = nil
local SeaGreen = 12713921 -- RGB(193, 255, 193) нежно-зеленый
local RosyBrown = 12698111 -- RGB(255, 193, 193) нежно-розовый
local getParamEx = _G.getParamEx
local GetCell = _G.GetCell
local Highlight = _G.Highlight
local SetCell = _G.SetCell
local ds
function _G.OnParam(class, sec)
if t_id and sec == sec_code and class == class_code then
local last_price = tonumber(getParamEx(class_code, sec_code, 'LAST').param_value) or 0
local lp = GetCell(t_id, 1, 0).value or last_price
if lp < last_price then
Highlight(t_id, 1, 0, SeaGreen, 0, 1000)
elseif lp > last_price then
Highlight(t_id, 1, 0, RosyBrown, 0, 1000)
end
SetCell(t_id, 1, 0, tostring(last_price), last_price)
end
end
local function CreateTable()
t_id = _G.AllocTable()
_G.AddColumn(t_id, 0, "price", true, _G.QTABLE_DOUBLE_TYPE, 15)
_G.CreateWindow(t_id)
_G.SetWindowPos(t_id, 90, 120, 170, 100)
_G.InsertRow(t_id, 1)
_G.InsertRow(t_id, 2)
end
local function Animate()
local animation_symbol = "|"
local curSymbol = 0
local maxSymbols = 20
return function()
curSymbol = curSymbol + 1
curSymbol = curSymbol>maxSymbols and 1 or curSymbol
return string.rep(animation_symbol,curSymbol)
end
end
function event_callback(_, msg)
if (msg == _G.QTABLE_CLOSE) then
isRun = false
end
end
function _G.OnInit()
CreateTable()
_G.SetTableNotificationCallback(t_id, event_callback)
end
function _G.main()
ds = _G.CreateDataSource(class_code, sec_code, 1)
isRun = ds ~= nil
if ds then
ds:SetEmptyCallback()
end
local GetNextAnimationSymbol = Animate()
while isRun and ds do
SetCell(t_id, 2, 0, GetNextAnimationSymbol(), 0)
sleep(60)
end
end
function _G.OnStop()
isRun = false
ds:Close()
ds = nil
if t_id and not _G.IsWindowClosed(t_id) then
_G.DestroyTable(t_id)
end
end
Nikolay написал: Причем видно, что это происходит при подсвечивании ячейки таблицы. Относительно помогает сгладить замирания - увеличение периода подсветки до 1000 мс.
Да, Highlight, конечно жёстко тормозит вывод. Но у меня получается наоборот, чем меньше timeout в Highlight, тем плавнее обновляется вторая строка.
Надо делать так, как надо. А как не надо - делать не надо.
Старатель написал: Я давно заприметил функцию UpdateRow в QLua. Что это за функция такая, что она делает?
Это старая не публичная функция которая появилась в терминале версии 6.6. К сожалению зачем она была добавлена уже никто не вспомнит, возможно для каких-то специфичных проектов. Раз релиза ее не было, значит и использовать ее не следует.
Nikolay написал: Вот простейший код. Он уже приводился в этой ветке. Добавил вывод анимации для более наглядного представления.
При использовании темной темы все более менее плавно. Светлая - замирания окна таблицы.
Причем видно, что это происходит при подсвечивании ячейки таблицы.
Относительно помогает сгладить замирания - увеличение периода подсветки до 1000 мс.
Но в темной теме все плавно для 500 мс и 60 мс задержки основного цикла.
Код
local sec_code = 'SRU0'
local class_code = 'SPBFUT'
local sleep = _G. sleep
local isRun = true
local t_id = nil
local SeaGreen = 12713921 -- RGB(193, 255, 193) нежно-зеленый
local RosyBrown = 12698111 -- RGB(255, 193, 193) нежно-розовый
local getParamEx = _G. getParamEx
local GetCell = _G. GetCell
local Highlight = _G. Highlight
local SetCell = _G. SetCell
local ds
function _G.OnParam (class, sec)
if t_id and sec = = sec_code and class = = class_code then
local last_price = tonumber( getParamEx (class_code, sec_code, 'LAST' ).param_value) or 0
local lp = GetCell (t_id, 1 , 0 ).value or last_price
if lp < last_price then
Highlight (t_id, 1 , 0 , SeaGreen, 0 , 1000 )
elseif lp > last_price then
Highlight (t_id, 1 , 0 , RosyBrown, 0 , 1000 )
end
SetCell (t_id, 1 , 0 , tostring(last_price), last_price)
end
end
local function CreateTable ()
t_id = _G.AllocTable ()
_G.AddColumn (t_id, 0 , "price" , true , _G.QTABLE_DOUBLE_TYPE, 15 )
_G.CreateWindow (t_id)
_G.SetWindowPos (t_id, 90 , 120 , 170 , 100 )
_G.InsertRow (t_id, 1 )
_G.InsertRow (t_id, 2 )
end
local function Animate ()
local animation_symbol = "|"
local curSymbol = 0
local maxSymbols = 20
return function ()
curSymbol = curSymbol + 1
curSymbol = curSymbol > maxSymbols and 1 or curSymbol
return string.rep (animation_symbol,curSymbol)
end
end
function event_callback (_, msg)
if (msg = = _G.QTABLE_CLOSE) then
isRun = false
end
end
function _G.OnInit ()
CreateTable()
_G.SetTableNotificationCallback (t_id, event_callback)
end
function _G.main ()
ds = _G.CreateDataSource (class_code, sec_code, 1 )
isRun = ds ~ = nil
if ds then
ds: SetEmptyCallback ()
end
local GetNextAnimationSymbol = Animate()
while isRun and ds do
SetCell (t_id, 2 , 0 , GetNextAnimationSymbol(), 0 )
sleep ( 60 )
end
end
function _G.OnStop ()
isRun = false
ds: Close ()
ds = nil
if t_id and not _G.IsWindowClosed (t_id) then
_G.DestroyTable (t_id)
end
end
Добрый день.
Проверили Ваш код. Что на светлой, что на темной теме каких-то особых отличий не видим.
Цена везде обновляется без задержек, что касается второй графической строки, то она тоже одинаково себя ведет в обоих случаях. Пришлите видео эффект на quiksupport@arqatech.com посмотрим, как проявляется эффект.
И первая строка и вторая. Первая неравномерно обновляется, нет плавной подсветки. Вторая часто замирает. На темной теме все намного плавнее. Вот, для наглядности: https://yadi.sk/i/S-T2kh3s2u59hA
Nikolay написал: И первая строка и вторая. Первая неравномерно обновляется, нет плавной подсветки. Вторая часто замирает. На темной теме все намного плавнее. Вот, для наглядности: https://yadi.sk/i/S-T2kh3s2u59hA
Здравствуйте!
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Версия 8.7.1.13 данные обновляю раз в 2 секунды но если не дёргать окно то обновляются изменённые данные не сразу (раз в 10-15 секунд ) и кажется с каждым разом всё дольше.
SetSelectedRow(hTable,2) SetSelectedRow(hTable,1)
работает исправно и заставляет перезагружаться, хотя хочется конечно без танцев с бубном и костылей.
Старатель, А что , бывает визуальная разница в скорости? К меня там мгновенно всё обновляется, а на порядок я никогда не обращал внимания. SetColor обычно первым идёт.
Серьёзно?! А у меня никогда никаких проблем не было. Бегло скользнул глазами - тут, похоже, опять какие-то микросекунды ловятся. А у меня обновление идёт раз в полторы секунды, при этом вряд ли кто-то работает с цветом больше меня. Вот скрин:
Прочитал тему. Поднимаю вопрос в 2022 году. Проблема как была, так и осталась. У меня вообще наипростейший скрипт - SetCell в main заполняет ячейки, без всяких там подсветок. Поставил как рекомендовали sleep(100) не помогает. Перепробовал разные задержки - ничего не меняется. Чтобы таблица обновилась нужно либо ткнуть мышкой в неё в любое место, либо навести курсор мыши на верхнюю часть окна с заголовком. По другому никак. Это не порядок. Проблему надо решать. Что хочу сказать разработчикам. Причина - не прорисовка окна. Насколько мне помнится, чтобы заставить окно перерисоваться принудительно, есть такая функция, UpdateWindow когда пишешь на C, она отправляет сообщение WM_PAINT непосредственно в процедуру указанного окна, обходя очередь приложения. Неужели нельзя для qlua разработчикам сделать аналог? У вас всё для этого есть. Квик создаёт окно таблицы для пользователя, у вас все хэндлы всех окон есть и окна таблицы пользователя тоже. Вот сама функция на C: BOOL UpdateWindow([in] HWND hWnd); Напишите же свою функцию для qlua и внутри неё воткните UpdateWindow. Вам это совсем просто сделать, так как вы знаете hWnd окна таблицы. А нам где его брать? Вобщем думаю вы можете это сделать. А то переписывал весь день с qpile скрипт на lua. переписал, а тут такой косяк. На qpile и то стабильней работает. Там выставил 1 сек период расчёта и хотя бы раз в секунду будет обновляться окно. Хотя заметил, что на qpile обновление окна тоже идёт только в самом конце скрипта независимо делаем мы add_item из мапа или нет, он только буфер таблицы заполняет, а непосредственно прорисовка окна в самом конце скрипта идёт. Надеюсь проблему решите. PS. Вы разработчики саму программу quik на каком языке пишите?
Пробовал: 1) получать заголовок окна через GetWindowCaption и заново его же выставлять через SetWindowCaption - не помогает. 2) получать координаты окна через GetWindowRect и заново выставлять окно по тем же самым координатам через SetWindowPos - не помогает. При этом окно становится поверх всех окон, только наведёшь другое окно на него, как моё окно становится поверх наведённого, причём данные в окне как не обновлялись, так и не обновляются. Чтобы обновились - по прежнему нужно либо ткнуть в окно мышкой, либо навести её на заголовок окна. 3) пробовал тоже самое что и п.1, только ещё плюс менять координаты на 1 пиксель, затем возвращать обратно - тут вообще смех просто получается - окно дёргается туда-сюда, а результат точно такой же как в п.1 Решения на данный момент нет. Программирование на Lua теряет всякий смысл при выводе данных в таблицу. Данные обновляются только в буфере программы, а окно не перерисовывается. Что делать? Писать отдельную программу на C? Искать окно в недрах Windows? Получать его хэндл и отправлять принудительно окну сообщение WM_PAINT на перерисовку? Это извращение какое-то.
Alexander написал: Пробовал: 1) получать заголовок окна через GetWindowCaption и заново его же выставлять через SetWindowCaption - не помогает. 2) получать координаты окна через GetWindowRect и заново выставлять окно по тем же самым координатам через SetWindowPos - не помогает. При этом окно становится поверх всех окон, только наведёшь другое окно на него, как моё окно становится поверх наведённого, причём данные в окне как не обновлялись, так и не обновляются. Чтобы обновились - по прежнему нужно либо ткнуть в окно мышкой, либо навести её на заголовок окна. 3) пробовал тоже самое что и п.1, только ещё плюс менять координаты на 1 пиксель, затем возвращать обратно - тут вообще смех просто получается - окно дёргается туда-сюда, а результат точно такой же как в п.1 Решения на данный момент нет. Программирование на Lua теряет всякий смысл при выводе данных в таблицу. Данные обновляются только в буфере программы, а окно не перерисовывается. Что делать? Писать отдельную программу на C? Искать окно в недрах Windows? Получать его хэндл и отправлять принудительно окну сообщение WM_PAINT на перерисовку? Это извращение какое-то.
Пункт 3 не помог потому, что окно сдвигал на 1 пиксель туда-сюда, при этом не меняя размер самого окна, а только изменяя координаты его верхнего левого угла. А вот если координаты левого верхнего оставить прежними, а менять координаты правого нижнего на 1 пиксель туда-сюда(фактически меняя размер всего окна получается), то окно начинает таки обновляться как положено. Но работать так невозможно, потому что окно во-первых дёргается, а во-вторых всегда поверх всех окон, только перекроешь его другим окном, как оно опять сверху.
Alexander написал: , точно. Попробовал использовать Highlight и действительно помогло! Спасибо. Но разрабам не помешает всё-таки сделать функцию UpdateWindow.
Помогло то помогло, да вот только не совсем. Если подсвечивать строку, которая ушла из поля видимости, например скроллингом, то таблица опять перестаёт обновляться. Я сделал так, чтобы подсвечивалась любая строка на которую ткнуть мышкой. Получается, что чтобы заствить таблицу обновляться - сначала тыкаю в любую строку в таблице, она подсвечивается и таблица обновляется. Если таблица большая и делаешь скроллинг(прокрутку) содержимого таблицы, то как только подсвечиваемая строка уходит за пределы таблицы, т.е. исчезает из поля видимости, то тут же таблица обновляться перестаёт. И нужно опять тыкать на любую видимую строку в таблице. Это не практично. Лучшее решение как я и писал выше - нужна функция UpdateWindow, но поддержка категорически молчит по этому поводу.
Разработчики, ответьте же хоть что-нибудь! Так же добавляю новую информацию для размышления. Попробовал отправлять сообщения WM_PAINT в цикле с задержкой 100 мс непосредственно окну таблицы из другой программы(написал на C++). Дескриптор окна необновляемой таблицы можно увидеть через Spy++. Сначала просто его использовал. Потом сделал автоматический поиск дескриптора в программе через FindWindow и FindWindowEx начиная с родительского окна QUIK. Так вот отправка WM_PAINT непосредственно процедуре обработки сообщений окна таблицы никакого результата не даёт, хотя SendMessage проходит без ошибок. Так же если отсылать в цикле UpdateWindow - тоже результата нет. UpdateWindow так же срабатывает без ошибок. Косяк на стороне квика. Выходит, что окно получает WM_PAINT, но перерисовывает его с необновлённого буфера. SetCell-ы видимо обновляют один буфер, но есть ещё другой буфер из которого WM_PAINT рисует окно, так вот из первого буфера во второй информация не попадает, а она туда должна попадать с периодичностью хотя бы 100 мс, тогда и WM_PAINT будет обновлять окно. Разработчики готовы вникнуть в суть проблемы или нет?
Alexander написал: Лучшее решение как я и писал выше - нужна функция UpdateWindow
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Anzhelika Belokur написал: Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Ещё добавляю информации. Как я и писал ранее удалось таки заставить обновляться таблицу используя функцию Highlight, но косяки остаются при уходе подсвечиваемой строки за пределы таблицы при прокрутке и надо опять подсвечтвать строку в поле видимости таблицы или тыкать в заголовок мышкой. А дополнение такое - если в таблице вывод идёт строковой переменной через SetCell и SetCell без последнего 4-го числового параметра, то Highlight не помогает и жутко тормозит, прокрутка таблицы идёт с лагом в секунды, а может и минуты. Поэтому, чтобы Highlight работала и заставляла принудительно обновлять таблицу, вызовы SetCell делаю с передачей ей 4-го параметра равного числовому значению, я использую 1, хотя можно и любое другое число, хоть ноль, лишь бы было число. Хотя по умолчанию это число при выводе строки не нужно. Вот такие вот особенности. Может поможет Вам разобраться в проблеме.
Anzhelika Belokur написал: Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Ещё добавляю информации. Как я и писал ранее удалось таки заставить обновляться таблицу используя функцию Highlight, но косяки остаются при уходе подсвечиваемой строки за пределы таблицы при прокрутке и надо опять подсвечтвать строку в поле видимости таблицы или тыкать в заголовок мышкой. А дополнение такое - если в таблице вывод идёт строковой переменной через SetCell и SetCell без последнего 4-го числового параметра, то Highlight не помогает и жутко тормозит, прокрутка таблицы идёт с лагом в секунды, а может и минуты. Поэтому, чтобы Highlight работала и заставляла принудительно обновлять таблицу, вызовы SetCell делаю с передачей ей 4-го параметра равного числовому значению, я использую 1, хотя можно и любое другое число, хоть ноль, лишь бы было число. Хотя по умолчанию это число при выводе строки не нужно. Вот такие вот особенности. Может поможет Вам разобраться в проблеме.
И ещё, если все вызовы SetCell будут с 4-м параметром числом и хотя бы один из них SetCell будет без этого параметра, то таблица обновляться не будет и будет подвисать, как только все SetCell-ы будут со всеми 4-мя параметрами, так начинает обновляться и не тормозит, но косяки с выходом подсвечиваемой строки за пределы видимости таблицы так и не пропадают.
Для разбора описанных Вами проблем, нам нужны примеры скриптов, один с 4-мя параметрами, когда таблица будет обновляться, второй без этого параметра. Просьба прислать запрошенную информацию нам на quiksupport@arqatech.com со ссылкой на данную ветку форума.
Для разбора описанных Вами проблем, нам нужны примеры скриптов, один с 4-мя параметрами, когда таблица будет обновляться, второй без этого параметра. Просьба прислать запрошенную информацию нам на quiksupport@arqatech.com со ссылкой на данную ветку форума.
Все тонкости проблемы описаны выше и достаточно подробно. Нет никакого смысла отправлять примеры скриптов. Всё расписано до мелочей просто. Зачем примеры скриптов с SetCell с 4-мя параметрами и с тремя? С 4-мя это когда 4 параметра, 3 - это когда 3. Что тут не ясно то? Отсутствует последний параметр когда 3 параметра. Если будете реально разбирать проблему, то разработчики пусть читают эту тему, последние сообщения все. Они знают свою программу и lua. Если они прочитают что написао в теме, то всё им и так будет ясно. Вобщем если кто реально будет вникать в проблему из разработчиков, то прочитав тему и все мои сообщения, он всё поймёт.
у SetCell 5 параметров ---------------------------------------1 ---------------2---------------3----------------4-----------------5----------- BOOLEAN SetCell(NUMBER t_id, NUMBER key, NUMBER code, STRING text, NUMBER value) если оставить 3 ,то что тогда будет обновлять ячейку? ---------------- Но спорящим видимо один ... продолжайте =======================