Обновление пользовательской таблицы/окна

Страницы: Пред. 1 2 3 4 След.
RSS
Обновление пользовательской таблицы/окна
 
если взять пример выше и убрать последний параметр в функции SetCell и Highlight , то все обновляется.
Может пример другой кто-нибудь напишет?
Код
local sec_code      = 'SBER'
local class_code    = 'QJSIM'

local SeaGreen      = 12713921  --  RGB(193, 255, 193) нежно-зеленый
local RosyBrown     = 12698111  --  RGB(255, 193, 193) нежно-розовый
local getParamEx    = getParamEx
local GetCell       = GetCell
local Highlight     = Highlight
local SetCell       = SetCell

local function get_price()
if flag 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
      SetCell(t_id, 1, 0, tostring(last_price))--, 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
    end
flag=false
end

function OnParam(class, sec)
     if t_id and sec == sec_code and class == class_code then    flag=true  end
end

function CreateTable()

    t_id =AllocTable()
    AddColumn(t_id, 0, "price", true, QTABLE_DOUBLE_TYPE, 15)
    CreateWindow(t_id)
    SetWindowPos(t_id, 90, 120, 170, 100)
    InsertRow(t_id, 1)
    InsertRow(t_id, 2)
end

local function Animate(sym,maxSym)
    if sym and maxSym>string.len(sym) then sym=sym..'|' else sym='|' end
    return sym
end


function event_callback(_, msg)
    if (msg == _G.QTABLE_CLOSE) then
        isRun = false
    end
end

function OnInit()
    CreateTable()
    SetTableNotificationCallback(t_id, event_callback)
   flag=true
   get_price()
end

function main()
    ds   = CreateDataSource(class_code, sec_code, 1)
    isRun = ds ~= nil
    if ds then
        ds:SetEmptyCallback()
    end


    while isRun and ds do
   get_price();
    sym=Animate(sym,20)
     SetCell(t_id, 2, 0, sym, 0)
    sleep(100)
    end
end
 
поясняю, для тех кто пишет на "чистом" луа.
---------------
в исходном примере
операторы типа   _G.QTABLE_CLOSE  заменил на QTABLE_CLOSE
так как исходная запись это - масло масленое
_G  - это глобальная таблица
а QTABLE_CLOSE  - это функция в ней
поэтому _G.QTABLE_CLOSE   это тоже самое , что просто QTABLE_CLOSE
------------------
такая запись используется в создании модулей , а здесь не модуль, поэтому смысла в ней нет.
 
Alexander, добрый день.

Скрипт, непосредственно используемый Вами, необходим для дальнейшего изучения вопроса по данному обращению. Просим Вас предоставить запрошенную ранее информацию.
 

Alexander правильно обратил внимание на числовой параметр NUMBER value в функции SetCell. Думаю из-за него возникает проблема с обновлением отображения данных в пользовательской таблице. Но у меня наоборот, когда стояли числовые параметры во всех SetCell, данные обновлялись лишь при клике мышки. А после того, как их все убрал, начало обновлять правильно. Возможно это из-за того, что некоторые столбцы у меня со строковыми типами данных, а для них не нужно было задавать параметр "value". При этом в main для задержки стоит sleep(200).

Из Руководства пользователя QLua:

BOOLEAN SetCell(NUMBER t_id, NUMBER key, NUMBER code, STRING text, NUMBER value) ... Параметр «value» необязательный и по умолчанию равен «0». Для столбцов со строковыми типами данных параметр «value» не задается.

 
Сюда что-то и не заходил давно. Да 5 параметров. Перепутал видимо. В общем обновляется хоть как-то когда когда SetCell с 5-ю параметрами, в конце просто ставлю 1-цу, иначе не обновляется и Highlight подсветка обязательно и строка с подсветкой должна быть внутри таблицы в видимой части. А вообще это или криво работает WM_PAINT в оконной процедуре таблицы, либо WM_PAINT отрабатывает по честному, но данные для отображения в буфере не обновляются как положено, без исходников не поймёшь.
 
nikolz, если
Цитата
nikolz написал:
если взять пример выше и убрать последний параметр в функции SetCell и Highlight , то все обновляется. Может пример другой кто-нибудь напишет?
Тут всё видимо у всех по разному. И всё связано с тем как они обновляют содержимое таблиц. Ведь вся программа квика - это один огромный цикл где каждой операции выделяется слот времени и вот видимо если код скрипта по своей продолжительности успевает как-то вклиниться между слотами времени, то на следующей итерации квик обновит буфера таблицы, если нет - то постоянно квик проходит "мимо". Здесь надо знать сам алгоритм как у них там всё организовано.
 
И у меня там цикл в main шибко многочисленный на вызова подряд функций, вызовов много, так что от начала цикла до конца проходит видимо очень много времени и это видимо тоже как-то влияет. При тыке мышкой по шапке окна видимо обработчик мыши срабатывает, и он заставляет перерисовать окно и WM_PAINT перерисовывает, а по другому нет - жди очереди, а очередь всё никак не приходит, потому, что постоянно квик пролетает мимо в цикле по причине всех этих слотов времени и задержек, которые никак не могут коррекектно работать между собой в теле цикла квика.
 
В очередной раз поднимаю тему. Прошу ответить разработчиков почему до сих пор ничего не сделано для решения данной проблемы. Ещё раз. Есть таблица. Производим обновление ячейки или ячеек в цикле. Данные берутся с ТТТ(в данном случае цена последней сделки) и выводятся в таблицу. В ТТТ данные меняются как положено. Никакого обновления ячейки в таблице на экране монитора НЕ ПРОИСХОДИТ!!! Бывает, когда добавишь или убавишь код в скрипт обновляться начинает. Или поставишь задержку в цикле, подобранную начиная с 10 миллисекунд и до тех пор пока не начнёт обновляться синхронно с ТТТ. Потом запускаешь скрипт повторно и уже опять ничего не обновляется. Меняешь задержки, бывает и до секунды ставишь и ничего не обновляется. А бывает вообще никаких задержек не ставишь и всё обновляется. Скрипт может быть любой, не важно какой. Везде так. Цикл. Вывод и всё. Для того, чтобы точно обновилась таблица надо либо изменить размер таблицы вручную, либо ткнуть на строку в таблице, но только на любую новую строку, а не на ту, что уже текущая. Вот и что делать предлагаете? Без конца сидеть и менять размер окна таблицы? Или без конца тыкать по строкам? Ну это же бред какой-то!!! Все таблицы квика нормально обновляются. Что там не так у вас работает? Или напишите хоть принцип как и когда при каких условиях у вас происходит обновление таблиц пользователя. Ну в конце-то концов проблему надо же как-то решать. Задолбало уже просто. Пишешь, пишешь и ничего не обновляется. То обновляется то нет. Проблема на стороне квика и её решить можно 100%.
 
Цитата
Alexander написал:
В очередной раз поднимаю тему. Прошу ответить разработчиков почему до сих пор ничего не сделано для решения данной проблемы. Ещё раз. Есть таблица. Производим обновление ячейки или ячеек в цикле. Данные берутся с ТТТ(в данном случае цена последней сделки) и выводятся в таблицу. В ТТТ данные меняются как положено. Никакого обновления ячейки в таблице на экране монитора НЕ ПРОИСХОДИТ!!! Бывает, когда добавишь или убавишь код в скрипт обновляться начинает. Или поставишь задержку в цикле, подобранную начиная с 10 миллисекунд и до тех пор пока не начнёт обновляться синхронно с ТТТ. Потом запускаешь скрипт повторно и уже опять ничего не обновляется. Меняешь задержки, бывает и до секунды ставишь и ничего не обновляется. А бывает вообще никаких задержек не ставишь и всё обновляется. Скрипт может быть любой, не важно какой. Везде так. Цикл. Вывод и всё. Для того, чтобы точно обновилась таблица надо либо изменить размер таблицы вручную, либо ткнуть на строку в таблице, но только на любую новую строку, а не на ту, что уже текущая. Вот и что делать предлагаете? Без конца сидеть и менять размер окна таблицы? Или без конца тыкать по строкам? Ну это же бред какой-то!!! Все таблицы квика нормально обновляются. Что там не так у вас работает? Или напишите хоть принцип как и когда при каких условиях у вас происходит обновление таблиц пользователя. Ну в конце-то концов проблему надо же как-то решать. Задолбало уже просто. Пишешь, пишешь и ничего не обновляется. То обновляется то нет. Проблема на стороне квика и её решить можно 100%.
Если желаете решение то выкладывайте пример.
-----------
Относительно задержи, полагаю вы на правильном пути рассуждения.
Что такое Sleep? Это отказ от исполнения скрипта на указанное время.
Если Вы отключили исполнение, то каким образом у Вас будет обновление?
 
Alexander, Есть таблица. Производим обновление ячеек в цикле. Многие данные берутся из ТТТ, часть рассчитывается скриптом. В таблице тысячи, иногда десятки тысяч ячеек, в т.ч. цена последней сделки по каждому тикеру (то бишь строке таблицы). Часть ячеек подкрашивается цветом фона и/или текста. Таблица перерисовывается раз в две секунды, всё прекрасно обновляется. Размер таблицы иногда меняется (редко), никто ни в какие строки в таблице не тычет (а если тычет, то обычно вызывается контекстное меню по тикеру), Всё это дело работает уже много месяцев, работает как часы, за исключением нескольких давних случаев пропадания текста во всех ячейках таблицы (давно здесь разобранного и легко излечимого). А делать я предлагаю - посмотреть внимательно на код своего собственного скрипта - это ж талантище нужно иметь, чтобы ТАКОГО добиться!
 
Цитата
nikolz написал:
Если желаете решение то выкладывайте пример.
Да какой пример? Пример огромный, как я его сюда весь выложу? Я же говорю, всё элементарно. Цикл. В цикле читается ТТТ, поле last выводится в одну и ту же ячейку. Один и тот же скрипт может то вывожить, то не выводить, с одной задержкой к конце цикла выводить, с другой задержкой не выводить. Вот сейчас 4 ОДИНАКОВЫХ скрипта работают, разница только а начальных переменных. И всё. Один обновляет ячейку, 3 нет. Тот, что обновляет при выводе в другую ячейку перестаёт выводит. Меняя задержки можно добиться вывода, но стоит что-то добавить или убрать(код) из цикла и опять может либо выводить, либо не выводить. Вот ниже часть, которая сейчас не выводит:
   repeat
        price = tryInt(getParamEx(ClassCode, SecCode, "LAST").param_value)
        OfferPrice, BidPrice = getPrice()
        if not OfferPrice  then
             is_run = false
             return
        end

        if OfferPrice > Max or BidPrice < Min then
             break
        end

       if price ~= oprice then
             ---  ячейку для вывода текущего значения фьючерса в диапазоне устанавливаем значением фьючерса
             SetCell(tbl.t_id, LevNum + 1,  FUT,  tostring(price), 1)
             local finres = getLevelsSum() + LevelsFinRes(price) + getCloseSum()
             if finres ~= 0 then
                  SetCell(tbl.t_id, LevelsCount + 3,  FRA,  tostring(finres), 1) --- +/- финансовый результат общий
             end
        end
---         sleep(1000)
        oprice = price
   until is_run == false

Этот цикл внутри функции, которая внутри while, который  в main()
Когда внутри этого цикла крутится - ничего сейчас не обновляется. Бывает я даже в другую часть скрипта код добавлю или убавлю и тогда начинает когда внутри этого цикла выводить или наоборот перестаёт выводить если сначала выводило.
Когда из этого цикла вывожу в основной while, то там тоже вывод в ячейку, сейчас он выводит там, а бывает наоборот всё меняется местами, во while перестаёт выводить
Короче это от скрипта вообще не зависит, это зависит от кода, сколько его и за сколько времени какая часть кода выполняется. Если это время как-то согласовывается со временем обновления таблицы у квика, то обновляется, если не попадает в какой-то диапазон, то всё.
У меня многие таблицы есть большие, обновляются без проблем, но там много выводов и в разные ячейки и всё это в перемешку с вызовами функций.
 
Цитата
Alexander написал:
Цитата
Выше я выкладывал скрипт, который тестировал. И все там обновляется.
-------------------------
В вашем случае, так как полного скрипта нет, могу лишь предположить.
--------------------
Проблема в Вашем скрипте .  
Возможно у Вас внутренний цикл блокирует обновление таблицы.
-----
Попробуйте убрать его.
У Вас уже есть один внешний цикл и часто внутренние циклы оказываются лишними.
---------
В программах реального времени (QUIK и скрипты - это и есть программы РВ)
применение циклов считается плохим решением.
Как правило они лишь тормозят обработку и всегда можно сделать алгоритм без этих циклов.
 
nikolz, Проблема, разумеется, в скрипте, но при чём тут циклы? У меня точто так же "один внешний цикл" (бесконечный) и внутренний (по тикерам, т.е. по строкам выводимой таблицы). И мне пока что за мои почти полвека в программировании ещё не встречались идиоты, считающие применение циклов плохим решением. Но если "там много выводов и в разные ячейки и всё это вперемешку с вызовами функций", такой код И НЕ МОЖЕТ работать нормально. Весь этот ужас вроде:
SetCell(tbl.t_id, LevNum + 1,  FUT,  tostring(price), 1)
я даже смотреть не хочу. Навскидку: вот мои пара операторов для прорисовки таблицы:
SetColor(T,a[i][0][9],-1,k,l,-1,-1);
SetCell(T,a[i][0][9],0,d(i));
То есть у меня в SetCell четыре аргумента, а здесь их пять.
 
Пять аргументов передается если тип колонки таблицы число.

Вы я  приводил простейший пример, приводящий к замедлению обновления таблицы  для светлой темы терминала. На темной теме тот же скрипт работает  плавно.
Уже давно добавил Highlite при выводе в светлой теме, т.к. ждать решения разработчиков долго. Ну и отказался от частых обновлений таблиц. Затратное это дело в терминале.
 
Nikolay,
Цитата
Пять аргументов передается если тип колонки таблицы число.
Даже так? Ну, этого я никогда не делал, я почти сразу понял, что единственный тип данных в Луа и таблицах Квика - это строка. Highlite тоже никогда не пользовался, а насчёт "частых обновлений таблиц" - никакое это не "затратное дело в терминале". Я тестировал работу скрипта при количестве тикеров (строк таблицы) более 20 000, т.е в таблице было порядка полумиллиона ячеек - там были заметны тормоза (по крайней мере, на моём дохленьком процессоре), но не особо критичные. Но данные всегла прекрасно обновлялись  К тому же, таблица моя всегда раскрашена, как попугай (на второй странице этой ветки я приводил скриншот два года назад), а это не только обилие SetCell, но и SetColor.
 
Цитата
nikolz написал:
Выше я выкладывал скрипт, который тестировал. И все там обновляется.
С утра запущены 4 скрипта абсолютно одинаковые. Выставлены разные переменные просто. Все 4 скрипта сейчас идеально всё выводят в ячейку и показывают last синхронно с ТТТ. При этом код сейчас крутится в вышеприведённом цикле(так как last в определённом диапазоне). При выходе из этого диапазона идёт выход из цикла и из функции и попадаем в main() в цикл while(так как уже в другом диапазоне last). Там во while тоже идёт вывод в ячейку last, но только уже в другую и нихрена уже ничего не выводит! Щёлкнишь мышкой по строке - данные обновятся. Или размер окна дёрнешь - обновятся. Опять попадает last в нужный диапазон, опять вызов функции и в repeat цикл и опять всё обновляется. Вчера было всё НАОБОРОТ!!! while обновлял ячейку, repeat нет.
 
Цитата
Alexander написал:
Цитата
nikolz написал:
Выше я выкладывал скрипт, который тестировал. И все там обновляется.
С утра запущены 4 скрипта абсолютно одинаковые. Выставлены разные переменные просто. Все 4 скрипта сейчас идеально всё выводят в ячейку и показывают last синхронно с ТТТ. При этом код сейчас крутится в вышеприведённом цикле(так как last в определённом диапазоне). При выходе из этого диапазона идёт выход из цикла и из функции и попадаем в main() в цикл while(так как уже в другом диапазоне last). Там во while тоже идёт вывод в ячейку last, но только уже в другую и нихрена уже ничего не выводит! Щёлкнишь мышкой по строке - данные обновятся. Или размер окна дёрнешь - обновятся. Опять попадает last в нужный диапазон, опять вызов функции и в repeat цикл и опять всё обновляется. Вчера было всё НАОБОРОТ!!! while обновлял ячейку, repeat нет.
Гадать нет смысла, а запустить у себя Ваш скрипт нет возможности.
Но ,без обид,уверен, что ошибка Ваша, а не КВИКА.
 
Цитата
nikolz написал:
Проблема в Вашем скрипте .  Возможно у Вас внутренний цикл блокирует обновление таблицы.
Проблема не в моём скрипте абсолютно! Ничего нигде не блокируется. Тупо чтение last, тупо вывод, какое блокирование. Скажу больше. Вечером накидал простейший скрипт. В нём вообще ничего нет, кроме чтения last и вывод в ячейку. Таблицы. Всё выводит просто идеально. Даже без всяких задержек sleep(). Я пытался сделать так, чтобы он перестал выводить, но что я только не делал, и  ячейки добавлял и сетколоры и циклы вставлял дополнительные, короче много чего. Мне так и не удалось сделать так, чтобы скрипт перестал обновлять ячейку. Всё работала как часы. В SetColor использовал 4 параметра, не 5, так как в в таблице стринг поля. Потом я добавил в SetCell последний числовой 5-й парметр - перестало обновляться. Сделал всё так же в своих скриптах. И у меня после этого стало всё наоборот. Тот диапазон, который не обновлялся - стал обновляться, а тот который обновлялся - перестал обновляться. Делаешь наоборот - меняется. Но даже когда начинает обновляться допустим в одном диапазоне, добавляешь код в скрипт, и даже не в цикле, и всё ломается - перестаёт обновляться. Хоть как ты SetCell используй. Ещё раз - от скрипта не зависит, зависит от времени выполнения участков кода.
 
Цитата
nikolz написал:
Попробуйте убрать его.
Я не могу убрать цикл. При попадании в диапазон цен я вывожу текущий last для информации и показываю его напротив текущего диапазона. При этом так же при измениении last считаются и финрезультаты по диапазонам и тоже выводятся в нужные ячейки. А при выходе за границы текущего, вот тут уже начинаются действия(buy/sell - пока в тесте). Короче без цикла никак. Да и вообще весь скрипт - это сплошной цикл. Если вне всех диапазонов, то цикл while в main() и тоже вывод в ячейки, при попадании в новый диапазон - опять вызов функции и крутимся там с выводом до тех пор, пока из него не выйдем.
 
Цитата
Владимир написал:
Весь этот ужас вроде:SetCell(tbl.t_id, LevNum + 1,  FUT,  tostring(price), 1)я даже смотреть не хочу. Навскидку: вот мои пара операторов для прорисовки таблицы:SetColor(T,a[0][9],-1,k,l,-1,-1);SetCell(T,a[0][9],0,d(i));То есть у меня в SetCell четыре аргумента, а здесь их пять.
В чём ужас? В 5-м параметре? Я могу его убрать. Это ничего не меняет! Скинул то, что было на данный момент. Я и ранее и сейчас как только не пробовал. И стринг в таблице и 4 параметра и доубл таблица и 5 параметров, и стринг таблица и 5 параметром, причём 5-й тоже число, что и 4-й, и не то, и наоборот доубл таблица и 4 параметра. Всё это ничего не меняет абсолютно. То обновляет, то нет. При замене может начать обновлять или наоборот если обновляло  - перестать. Иной раз скрипт работает не обновляет. добвил коду или что-то чуть изменил, запускаешь, всё начало обновлять.
 
Цитата
Nikolay написал:
Пять аргументов передается если тип колонки таблицы число.Вы я  приводил простейший пример, приводящий к замедлению обновления таблицы  для светлой темы терминала. На темной теме тот же скрипт работает  плавно.Уже давно добавил Highlite при выводе в светлой теме, т.к. ждать решения разработчиков долго. Ну и отказался от частых обновлений таблиц. Затратное это дело в терминале.
Вот тоо, что при разных темах квика таблицы по разному обновляются вам ни о чём не говорит? При чём здесь скрипт? В том и дело, что ни причём! А вот тема причём! Какого хрена смена темы влияет на результат работы вывода скрипта? Вот сюда надо копать, а не искать проблемы в скрипте! Я и Hightlite пробовал, иногда помогает, но всё тоже самое, добавишь код или изменишь код - перестаёт. В одном скрипте Highlite поставил удачно - помогло, это в тот где много выводит и считает. Сейчас помогает через раз. Бывает  в sleep() секунды ставишь и ничего не обновляет, пока не ткнёшь в таблицу. Ну и причём здесь скрипт? А отказываться от частых обновлений почему должны? Таблицы квика обновляются все как положено и даже все стаканы как угорелые меняются.
 
Цитата
nikolz написал:
Гадать нет смысла, а запустить у себя Ваш скрипт нет возможности.Но ,без обид,уверен, что ошибка Ваша, а не КВИКА.
Сто процентов не у меня! Какая нахрен ошибка? Один и тот же скрипт с утра и с вечера по разному заработал! В скрипте ничего не меняется. Один и тот же код, один и тот же цикл - то выводит, то не выводит. Я скажу так. В курсе вообще как и когда обновление окна происходит надеюсь. WM_PAINT это его дело! Так вот при при щелчке мышки в окне, WM_SIZE срабатывает, его разрабы написали, что он обрабатывает его, при этом все данные от SetCell попадают туда, куда надо - в буфер, а далее InvalidateRect или UpdateWindow, что вызывает WM_PAINT, где и перерисовывается таблица. Тож самое при щелчке мышкой WM_LBUTTONDOWN только срабатывает. Так вот а когда и как срабатывает WM_PAINT для окна, когда мы не щёлкаем, не меняем размер окна, когда окно просто на экране и ничего с ним не делаем? Вот это пусть разрабы и ответят. Об этом я их уже сколько прошу? Нет ответа никакого. Думаю вот если проблема не закроется - писать прогу, чтобы слала в окно сообщение WM_SIZE из вне с определённой переодичностью. Т.е. насильно извне заставить обработать WM_PAINT/ Может так и заработает, но при условии, что все данные от SetCell уже есть в нужном буфере. А если они не в буфере из которого идёт обновление таблицы, а "болтаются" неизвестно где, мало ли как у них там это реализовано?, промежуточные буфера, очереди и прочее, тогда ничего и так не получится!
 
Я ранее уже как-то писал и отправлял сообщение прямо в окно. Но я не помню, что именно. Может я слал сразу WM_PAINT или UpdateWindow делал. Тогда это не помогло и забросил это всё. Сейчас я подумал по другому, что надо слать не это, а именно то, от чего срабатывает, т.е. WM_SIZE. Просто может быть, что когда WM_SIZE, то разрабы туда воткнули обновление буферов окна из того, куда сначала SetCell шлёт, а потом уже и InvalidateRect. А когда напрямую WM_PAINT, то обновление окна идёт, но в буферах не те данные ещё. Короче был бы у меня код, что у разрабов, я бы сделал так как надо!
 
Цитата
Alexander написал:
Цитата
nikolz написал:
Гадать нет смысла, а запустить у себя Ваш скрипт нет возможности.Но ,без обид,уверен, что ошибка Ваша, а не КВИКА.
Сто процентов не у меня! Какая нахрен ошибка? Один и тот же скрипт с утра и с вечера по разному заработал! В скрипте ничего не меняется. Один и тот же код, один и тот же цикл - то выводит, то не выводит. Я скажу так. В курсе вообще как и когда обновление окна происходит надеюсь. WM_PAINT это его дело! Так вот при при щелчке мышки в окне, WM_SIZE срабатывает, его разрабы написали, что он обрабатывает его, при этом все данные от SetCell попадают туда, куда надо - в буфер, а далее InvalidateRect или UpdateWindow, что вызывает WM_PAINT, где и перерисовывается таблица. Тож самое при щелчке мышкой WM_LBUTTONDOWN только срабатывает. Так вот а когда и как срабатывает WM_PAINT для окна, когда мы не щёлкаем, не меняем размер окна, когда окно просто на экране и ничего с ним не делаем? Вот это пусть разрабы и ответят. Об этом я их уже сколько прошу? Нет ответа никакого. Думаю вот если проблема не закроется - писать прогу, чтобы слала в окно сообщение WM_SIZE из вне с определённой переодичностью. Т.е. насильно извне заставить обработать WM_PAINT/ Может так и заработает, но при условии, что все данные от SetCell уже есть в нужном буфере. А если они не в буфере из которого идёт обновление таблицы, а "болтаются" неизвестно где, мало ли как у них там это реализовано?, промежуточные буфера, очереди и прочее, тогда ничего и так не получится!
если хотите выложите скрипт я могу его запустить на демо сервере и сказать Вам конкретно.
 
То, что проблема не в скрипте это же вообще элементарно понятно! Скрипт работает. Я в ТТТ вижу текущее значение last. В таблице в ячейке значение не равно last, там старое какое-то значение. Я бац - ткнул мышкой в табличку и значение поменялось!!! И стало равно значению в ТТТ. Скрипт работает!!! Далее в таблице это обновлённое значение так и висит. А last опять поменялся в ТТТ, а в таблице нет. Опять щёлк в таблицу и оооо, ура!!!, опять значение поменялось и стало равно как в ТТТ. О чёт это всё говорит? Что скрипт нормально себе работает, нормально всё считывает и отправляет в ячейку. Но сама таблица не обновляется. Скрипт за обновление таблицы отвечает только на уровне SetCell, а вот за реальное обновление уже отвечает сам квик. И делает он это криво! Еще раз. Как и при каких обстоятельствах происходит обновление таблицы на уровне оконной процедуры в квике, когда мы не тыкаем таблицу и она просто на экране? Как? Когда в буферах актуальные данные от SetCell? С какой периодичностью они  в WM_PAINT реально выводятся в рабочее окно таблицы?
 
Цитата
nikolz написал:
если хотите выложите скрипт я могу его запустить на демо сервере и сказать Вам конкретно.
Я не буду скрипт отсылать. В этом необходимости нет. Проблема ясна. И она в квике. Проблема в обновлении окна на стороне квика!
 
Alexander, Проблема В СКРИПТЕ! У всех данные прекрасно обновляются, а у Вас нет. Квик тот же, скрипты - разные. Точка.
 
Цитата
Владимир написал:
Alexander, Проблема В СКРИПТЕ! У всех данные прекрасно обновляются, а у Вас нет. Квик тот же, скрипты - разные. Точка.
Не у всех. Проблема в особенностях скрипта. Скрипт может быть корректным, но будет воспроизводиться проблема. Переписав скрипт по-другому, проблема уйдет.
Но это не отменяет факт разного поведения в разных темах, различиях в поведении в зависимости от места вызова SetSell. Впрочем, с Вами спорить бесполезно. Тестовые скрипты уже были предоставлены, поддержка написала "Проблема изучается" и "Будет исправлена" https://forum.quik.ru/messages/forum10/message49120/topic3777/#message49120.

Я решил вопрос для светлой темы. Кто-то так и не смог из-за особенностей их скриптов.
 
Nikolay, Не у всех. Только у тех, у кого проблемы в скрипте.  :smile:  Если есть проблема, скрипт НЕ МОЖЕТ быть корректным. Впрочем, со мной спорить бесполезно. А на техподдержку я перестал обращать внимание после того, как она во второй раз зарегистрировала моё предложение. Я без понятия, что такое "светлая тема". Лично я решил ВСЕ вопросы для моего скрипта. Все до единого. И только тогда мой скрипт стал корректным, и давно уже пребывает в этом состоянии.
 
Цитата
Владимир написал:
Alexander , Проблема В СКРИПТЕ! У всех данные прекрасно обновляются, а у Вас нет. Квик тот же, скрипты - разные. Точка.
Ещё раз! И причём для всех кто читает эту тему. Никакой проблемы в скрипте нет и быть не может! Сейчас я вам всем это покажу. Запустил скрипты. Один из скриптов перешёл в режим, когда ячейка не обновляется. Через spy++ я нашёл HWND окна таблицы. Я не поленился и только что написал программу на С++. Эта программа в цикле тупо отсылает сообщение WM_SIZE прямо в окно с найденным мной HWND c периодичностью 50 мс. И всё. Как только запускаешь программу, то таблица начинает обновляться сразу же и отображать ячейку с last синхронно с  ТТТ !!!!!!!!!! Останавливаешь прогу и перестаёт обновляться! Запускаешь - начинает! Всё проблема найдена! Как я и писал выше всё дело в обновлении окна. Оно КРИВО реализовано в квике! Криво! Для обновления того, что должен делать квик мне пришлось это делать из вне. Ну не абсурд ли это? Я должен извращаться и обновлять таблицу за квик? Бред какой-то. Неужели нельзя решить этот элементарный вопрос? Вот код с программы:

while (true) { HWND hWndPar = (HWND)0x0005006E;
SendMessage(hWndPar, WM_SIZE, 0, 0);
UpdateWindow(hWndPar);//Контрольный
Sleep(50);
};

При отсылке WM_PAINT не обновляется. Только WM_SIZE. Ну можно ещё от мыши воткнуть, будет наверняка работать. UpdateWindow(hWndPar) можно убрать, он WM_PAINT шлёт.
Так что вот и всё. И после этого кто-то скажет, что проблема в скрипте? Надо как-то по особенному писать скрипт? Скрипт работатет как надо. Пусть разрабы решают и устраняют свой косяк.
 
Далее из-за того, что проблема до сих пор не решена разработчиками квика придётся(хотя не хотелось бы) писать полноценную программы с поиском нужного окна, начиная с окна самого квика, чтобы каждый раз не запускать spy++, искать хэндл, вставлять его в прогу и перекомпилировать прогу с новой константой.
 
Цитата
Nikolay написал:
Тестовые скрипты уже были предоставлены, поддержка написала "Проблема изучается" и "Будет исправлена"  https://forum.quik.ru/messages/forum10/message49120/topic3777/#message49120 .
Афигеть просто. С 2020 года проблема признана разработчиками и до сих пор не решена! Вот это да! Супер товарищи разработчики! Просто супер! Ну что тут можно ещё сказать? Спасение утопающих - дело рук самих утопающих. Вот крутятся все, как могут. Разработчики хоть бы ответили что-нибудь, а то молчат, как партизаны.
 
Alexander, Ну, что же, ещё раз: разрабам НАСРАТЬ на свои косяки, всё оплачивает конечный юзер. Если глючит МОЙ скрипт, по ЛЮБЫМ причинам, то это МОИ проблемы. Я уже не раз писал, что четверть, если не треть моего кода преднаначена исключительно для компенсации глюков системного ПО. ТЗ на мой скрипт изобилует фразами типа:
В связи с множеством алгоритмических и технических ошибок в программном обеспечении терминала QUIK значительная часть кода скрипта предназначена для компенсации этих ошибок.
Или:
Снятие неисполненных или частично исполненных заявок происходит по таймеру (в «свечном» обработчике) для компенсации ошибки в программном обеспечении QUIK (приход нескольких прерываний на одно событие).
Или:
Функция прорисовки головной таблицы по тикерам. Выведена из main в отдельную функцию для возможности исправления ошибки программного обеспечения в терминале QUIK (исчезновение текста в ячейках таблицы).

Вы можете здесь плакаться в жилетку сколько угодно, но это Ваши, И ТОЛЬКО ВАШИ проблемы!
 
Цитата
Nikolay написал:
29.12.2022 20:34:14
Посмотрите Выше мое сообщение от 29.12.2022 20:34:14 относительно Вашего теста.
Он работает без проблем.
Если что-то не так, то выложите скрипт для теста проверю еще раз.
 
Цитата
nikolz написал:
Посмотрите Выше мое сообщение от 29.12.2022 20:34:14 относительно Вашего теста.
Посмотрел. Я же писал, что пробовал варианты с последним параметром в SetCell и Highlight - ом экспериментировал. Толку нет. В некотрых скриптах помогает, в некоторых нет. Это первое, что я делал. Да что толку-то. Ну исправит на раз, на другой раз не поможет. Проблему надо решать на стороне квика. Как я понимаю в реализации SetCell разрабы не хотят после каждого её вызова делать апдейт всего окна, что в принципе логично. Могли бы обновлять регион окна, где ячейка, но видимо и по этому пути идти не хотят или не умеют. Как именно реализована работа SetCell у них я не знаю. Я вижу только одно, что если ты сделал вызов SetCell, то нет никакой гарантии, что вызов функции приведёт к реальному обновлению части окна, ответственного за эту ячейку, не говоря уже про всё окно. В этом случае со стороны разработчиков возможно было бы просто делать апдейт всего окна целиком по таймеру, но они и этого делать не хотят. Они тупо как-то накапливают изменения видимо не от одного SetCell - а, а от нескольких и по какому-то только им известному алгоритму в какой-то только им известный момент делают апдейт и видимо всего окна таблицы сразу. Если бы работа каждого SеCell - а приводила бы только к обновлению региона окна где ячейка, думаю всё работало бы без проблем, и не надо было бы обновлять всё окно. Но для этого нужен алгоритм, которого у них нет. Этот алгоритм у них работает по ихнему и явно не лучшим образом. Тут со стороны разработчиков требуется работать на уровне оконных API виндовс.
 
Цитата
Владимир написал:
Вы можете здесь плакаться в жилетку сколько угодно, но это Ваши, И ТОЛЬКО ВАШИ проблемы!
Получается проблемы мы решаем только общаясь здесь между собой. А как же тогда достучаться до поддержки? Они же сайт этот сделали для чего-то? Чтобы в нём не участвовать?
 
Alexander, Именно так. Мне когда-то очень помог Антон, который давно уже исчез с этого форума. Здесь я познакомился с Борисом, профессионалом в области торговли. Здесь выявлялись и решались некоторые вопросы, иногда с участием техподдержки, но, как правило, без них - в сложных случаях техподдержка всегда молчит. Да и сайт этот, мягко говоря, не эталон - несколько раз просили, чтобы хотя бы сообщения свои можно было редактировать. Потом перестали. Так что "на бога надейся"...
 
Как SetCell работает это тайна. Но как можно было бы попробовать сделать. SetCell выводит данные сразу, без промежуточного хранения, в нужную часть буфера окна(DrawText, TextOut). Видимая часть окна разбивается на регионы. Если часть буфера окна под вывод данной ячейки в видимой части окна, то InvalidateRect в самом конце SetCell для региона окна для этой ячейки. Как-то так.  
 
Но похоже заниматься этим не будут. Хотя интересно. Сам квик иногда просит обновиться. Значит работают. Чего-то там делают, меняют. Что тогда меняют и для чего? Казалось бы вот и надо с каждым новым обновлением исправлять то, что уже накопилось. Но нет. Что тогда обновляют?
 
Цитата
nikolz написал:
Посмотрите Выше мое сообщение от 29.12.2022 20:34:14 относительно Вашего теста.
Он работает без проблем.
Если что-то не так, то выложите скрипт для теста проверю еще раз.
Я уже все выложил. Даже видео работы записал. Разработчики его увидели. Зачем мне что-то еще доказывать для Вас. Вы говорите что нет проблем, у меня же тот же скрипт на чистом демо квике выдает обратное. Себе я верю больше.
Тем более, что Вы видоизменили процесс вывода, убрав подсветку, убрав заполнение значения в ячейку, оставив только его представление.
Если разработчики скажут, что у нас есть проблема с выводом числовых значений, то да.
 
Вот с утра скрипты работают. Один не обновлял ячейку, когда в диапазоне, сейчас обновляет нормально. Количество выводимой информации в другие ячейки изменилось, сейчас её стало больше. Как это связано знают только разработчики.
 
Вобщем я решение предложил: https://forum.quik.ru/messages/forum10/message71748/topic3777/#message71748, а будут ли заниматься?
 
Цитата
Nikolay написал:
Вы говорите что нет проблем, у меня же тот же скрипт на чистом демо квике выдает обратное. Себе я верю больше.
Вот в том и дело, что nikolz думает, что раз у него работает, значит и у всех работать будет. Это не так. От чего там и когда идёт апдейт? Может даже зависит от количества других окон, от выводимой информации в окне и мало ещё от чего. Главное это то, что вызов SetCell абсолютно не гарантирует физический вывод в окно. Только куда-то там внутри окружения чего-то. Гарантировано апдейт всего окна делает обработчик WM_SIZE в оконной процедуре окна, что уже доказано.
 
А ведь ещё, что интересно? Что вызов главного рисовальщика WM_PAINT, который собственно и рисует в буфер окна и после которого апдейт содержимого из него автоматом после EndPaint не приводит к обновлению окна! А вот обработчик WM_SIZE обновляет. Значит он игнорирует изменение буфера окна не понятно по каким причинам. А такие события как изменение размера окна(вызов виндой WM_SIZE) это делают.
 
Alexander, SetCell работает вполне прилично. Раз в две секунды я переписываю всю таблицу, всё происходит довольно быстро. Возможно, глюки как-то связаны с этим дебильным разделением на потоки. Я в своё время потратил довольно много времени на перенос всего, что можно, в поток main, и с тех пор про глюки просто забыл. А новых версий Квика просто боюсь.
 
Цитата
Владимир написал:
SetCell работает вполне прилично. Раз в две секунды я переписываю всю таблицу, всё происходит довольно быстро.
У меня есть таблицы, там тоже раз в секунду обновление. Но это просто информационные таблицы с кое-какими рассчётами для анализа и там всё работает как положено. Но кое где такие задержки просто не приемлемы. При возникновении события нужен немедленный выход из скрипта без всяких задержек, либо само событие произойдёт как раз во время задержки, что тоже не приемлемо, так как не выйти пока в задержке. Поэтому SetCell прилично работает в информационных таблицах, но совершенно не приемлемо в других случаях. Раз SetCell не даёт гарантии 100%-ного обновления таблицы после его вызова - лично для меня это абсолютно не приемлемая работа данной функции. Не знаю, как повлияет на работу SetCell перенос всего в main(), может и станет работать как надо, но у меня всё построено на вызовах функций и всё переносить внутрь main() для меня лично это не подходит, так как  запутывает всё, никакой читабельности, всё в одной куче - не вариант для меня.
 
Alexander, А таблицы-то здесь каким боком? Это же только справочная информация для юзера. В моём скрипте даже "спящий режим" есть, когда таблица вообще не выводится. И что ещё за "немедленный выход из скрипта"?! Мой работает часами, днями, даже месяцами, и событий там как собак нерезаных. И при чём тут "внутрь main"? Я говорил про ПОТОК main. И уж точно ни одна таблица скрипту нафиг не нужна. Какие ещё могут быть "другие случаи"?
 
Цитата
Владимир написал:
Alexander, А таблицы-то здесь каким боком? Это же только справочная информация для юзера. В моём скрипте даже "спящий режим" есть, когда таблица вообще не выводится. И что ещё за "немедленный выход из скрипта"?! Мой работает часами, днями, даже месяцами, и событий там как собак нерезаных. И при чём тут "внутрь main"? Я говорил про ПОТОК main. И уж точно ни одна таблица скрипту нафиг не нужна. Какие ещё могут быть "другие случаи"?
В информационные таблицы вывод информации после рассчётов некоторых данных берущихся из таблиц квика в реальном времени. Мне нужны эти рассчётные данные онлайн для моего анализа. Немедленный выход не из скрипта, а из цикла в той же функции. Выход нужен для робота того же по условию. Если ни одна таблица скрипту во вашему не нужна, то тогда прошу ответить зачем в вашем скрипте есть таблица? Я предпочитаю те же сделки отображать в таблице, не только в файл всё писать. Есть например простой скрипт - щёлкнул по таблице - купил, щёлкнул - продал, сделка отобразилась. У меня разные всякие есть скрипты. Некоторые следят, некоторые позволяют определённую позицию например брать - продавать(покупка базы + продажа фьючерс например за раз), а решение для этого я могу принимать по другой таблице, в ней считается, данные из стакана берутся лучшие, выводится что мне надо. Короче, смотря что мне надо, то и использую. Ваш скрипт единственный он вообще что делает? Акциями торгует? Явно вроде не робот внутридневка.
 
Alexander, Нафига брать данные из таблий КВИКА? ЕДИНСТВЕННЫЙ случай, когда мой скрипт берёт данные из таблицы Квика - клик правой кнопкой, чтобы определить, по какому именно тикеру кликнули, дабы вызвать соответствующее контекстное меню.

Я уже ответил: в моём скрипте есть таблица ДЛЯ ЮЗЕРА. И есть "спящий режим", в котором она не выводится, только в заголовке маленького окошка тики меняются, чтобы было видно, что скрипт работает, а не висит. Для сделок есть готовая таблица сделок самого Квика, для заявок - таблица заявок, и я в эти таблицы почти никогда не заглядываю, а скрипту они и подавно не нужны. Да, есть у меня один из видов контекстного меню с кнопками "купить" и "продать", но это "рудимент" - я уже много месяцев вручную сделок вообще не совершаю. Но возможность осталась: щёлкнул - купил, щёлкнул - продал, сделка отобразилась (в таблице сделок). У меня ОДИН ЕДИНСТВЕННЫЙ скрипт, который делает ВСЁ, это ОН, А НЕ Я принимает решения. Торгует он акциями (изначально) и фьючерсами (Борькино влияние). Никакие другие бумаги (облигации, опционы) меня не интересуют.
 
Цитата
Владимир написал:
Alexander , Нафига брать данные из таблий КВИКА? ЕДИНСТВЕННЫЙ случай, когда мой скрипт берёт данные из таблицы Квика - клик правой кнопкой, чтобы определить, по какому именно тикеру кликнули, дабы вызвать соответствующее контекстное меню.
Как нафига? Скрипт берёт данные в основном либо из ТТТ, либо из стакана. Из своих собственных таблиц я данные не считываю, я их тута только вывожу.
Страницы: Пред. 1 2 3 4 След.
Читают тему
Наверх