Виталий (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Еще один вопрос про потоки
 
Да, теперь пример тот, что я и имел в виду. Я, кстати, сразу сделал потокобезопасную очередь. Смущало лишь, что стеки стейтов могут друг на друга наложиться. Оказалось, что нормально все - на форуме нашел ссылку на документацию. Благодарю за разъяснения!
Еще один вопрос про потоки
 
Цитата
nikolz написал:
В итоге каждый колбек пишет принимаемые им данные в свой массив
А функция main лишь читает эти данные.
Синхронизировать колбек и main нет надобности,
так как если колбек изменил данные, то main на следующем цикле их увидет.
У меня меин в блокировке ждет данных периодических...в этот момент колбеки вызывают функциии другие. Но стек то получается один и надо его синхронизировать.
Еще один вопрос про потоки
 
Цитата
Anton написал:
Цитата
Виталий написал:
Но ведь стейты разные же...и обращение к ним в любой момент времени не должно повлиять друг на друга
Смотрите, пусть у вас в длл есть сишный колбек OnAllTrade(lua_State * s). Квик его вызывает в потоке колбеков, передает стейт колбеков, на вершине стека лежит  ссылка  на таблицу с данными. При этом перед вызовом вашей сишной функции луа  отпустил лок . Пока вы не вернетесь из колбека, никто  этот  стек трогать не будет,  ссылка  так и лежит на вершине. В этом смысле да, стейты разные, стеки разные, в пределах потока со стеком можно делать что угодно и считать, что он, пока вы не вернулись из вызова, только ваш. В том числе можно смело lua_pushinteger и прочая. А вот  таблица , на которую ссылка указывает, она не ваша, ссылка на нее может быть и у другого потока, и тот тоже может с ней что-то делать в данный момент. Вот здесь вам надо синхронизировать доступ.
Ясно, спасибо!
Еще один вопрос про потоки
 
Цитата
Виталий написал:
Допустим на одном тике я в колбэк отправлю push_integer, а на следующем уже в колбэк также отправлю push_string. Не вызовет ли это неопределенного поведения?
Поправка
Допустим на одном тике я в меин отправлю push_integer, а на следующем уже в колбэк также отправлю push_string. Не вызовет ли это неопределенного поведения?
Еще один вопрос про потоки
 
Цитата
Anton написал:
Нет, в каждый момент времени выполняется только один колбек, между собой они никак не пересекутся, только с мейном.
Но ведь стейты разные же...и обращение к ним в любой момент времени не должно повлиять друг на друга...или все же разные стейты связаны друг с другом? К чему спрашиваю? Нужно ли как-то мне мэин и колбэк стеки вызовов синхронизировать или qlua.dll все уже сделала за меня? Допустим на одном тике я в колбэк отправлю push_integer, а на следующем уже в колбэк также отправлю push_string. Не вызовет ли это неопределенного поведения?
Еще один вопрос про потоки
 
Известно, что функция main и колбэки (напр. OnTransReply) выполняются в разных потоках. Далее к проекту подключена с++ либа и функции из нее вызываются как и из функции main так и из колбэков. Далее, я понимаю механику следующим образом:
- Функция main и колбэки отправляют в с++ либу разные lua_state, и поэтому в данном случае обращение к ним из либы в принципе не может пересечься  поэтому потокобезопасно.
- А вот разные колбэки сами по себе отправляют в либу одно и тоже lua_state и поэтому работа с ними в либе уже требует синхронизации.

Правильно ли я понял механизм?
Поиск инструмента по названию
 
Цитата
TGB написал:
Цитата
Виталий написал:
Все заработало как следует - терминал перестал падать.
   Вы в какой версии Quik работаете?  При выкладывании ошибок надо указывать версию QUIK, в которой эта ошибка возникает.
Думаю, уже неактуально. Причину выяснил. Это ascii кодировка некоторых данных в таблице getSecurityInfo и модуль json. Я добавил перекодировку в utf8 и все заработало стабильно и как следует.
Поиск инструмента по названию
 
Убрал строку
Код
r["jstring"] = json.encode(res)

Все заработало как следует - терминал перестал падать.
Поиск инструмента по названию
 
UPD а вообще в любом месте падает и до получения данных и после...По разному.
Поиск инструмента по названию
 
Цитата
s_mike@rambler.ru написал:
Access violation - это проблема внешней библиотеки или неправильная работа  с потоками qlua. Других вариантов не вилится
Я переделал код, сократив количество запросов через getClassSecurities, и терминал начал падать именно на некоторых запросах getSecurityInfo. Причем разных и рандомно.
Код
function CustomGetSecurityInfo(msg)
    local class_code = msg["class_code"]
    local sec_code = msg["code"]
    utils.dprint("Get info "..class_code.." "..sec_code)
    local res = getSecurityInfo (class_code, sec_code)
    utils.dprint("Got info")
    local r = {}
    r["jstring"] = json.encode(res)
    return r
end
В отладчике видно, что параметры правильные поступают, но терминал валится до появления строки "Got Info"

[5504] Get info PSAU RU000A0ZZXZ7

Терминал на этом месте падает. Причем на аналогичных предыдущих запросах функция возвращает необходимые данные.

Можно ли отсюда как-то разработчикам сообщить, или новую тему создавать надо?

Поиск инструмента по названию
 
Цитата
s_mike@rambler.ru написал:
Access violation - это проблема внешней библиотеки или неправильная работа  с потоками qlua. Других вариантов не вилится
Хорошо, тогда там попробую поискать. Спасибо.
Поиск инструмента по названию
 
Скорее всего нет - там примитивная функция проверки строки на подстроку и ОБЫЧНО она работает как следует. Попробую через searchitems поискать.
Поиск инструмента по названию
 
Необходимо каждый день находить код обновляемого инструмента. Из данных имеется только лишь его префикс от короткого имени. Обычно делается следующим кодом:
Код
function findSecurity()
    local mdt = 0
    local now = os.time()
    local foundcode = ""
    for i = 0,getNumberOf("SECURITIES") - 1 do
        local row = getItem("SECURITIES", i)
        if(row.class_code == "PSAU") and (autolib.CheckAssetName(row.short_name) == true) then
            --message(row.short_name)
            local info = getSecurityInfo(row.class_code, row.code)
            if info ~= nil then
                local expdt = strDateToEpoch(info.mat_date)
                --message(tostring(info) .. " " .. tostring(expdt) .. " " .. tostring(now))
                if expdt > mdt and expdt > now then 
                    mdt = info.mat_date
                    foundcode = row.code
                    --message(tostring(info.mat_date) )
                end
            end
        end
    end
    if foundcode ~= "" then
        autobuyerlib.LogU8(string.format("Найден инструмент %s", foundcode))
    end
end   
Проблема в том, что часто (процентов 20% случаев) запуск кода дает ошибку ACCESS VIOLATION. Есть ли иной способ решить задачу?
Несколько вызовов CreateDataSource
 
Цитата
TGB написал:
Вы это можете проверить сами экспериментально.
Как я узнаю, что данные заново с сервера скачиваются а не из кэша берутся?
Несколько вызовов CreateDataSource
 
Lua скрипт выступает в роли сервера, в котором несколько клиентов могут вызвать CreateDataSource с одинаковыми параметрами. Вопрос в том, будет ли каждый новый вызов заново требовать данные с сервера?
Уточнение принципа работы OnParam, RequestParams и GetParamEx2
 
Допустим, есть открытая таблица с множеством обновляемых параметров. И все они мне в колбэке скрипта OnParam не нужны, а нужен только один. Можно ли каким-то образом ограничить количество вызовов колбэка предварительной настройкой интересующих параметров? Если нет, то можно ли зарегистрировать пожелание на такой функционал.
Получение списка возможных полей возвращаемых GetParamEx
 
Владимир, спасибо!
Получение списка возможных полей возвращаемых GetParamEx
 
Есть один способ через DDE. Но хотелось бы без этого. Есть ли другие способы?
Параметр теоретической цены для getParamEx, Теоретическая цена опциона из таблицы текущих торгов
 
В таблице текущих торгов доступно поле теоретическая цена, как получить его из qlua через getPramEx?
Не найден модуль в файле .dll
 
Проблема решилась путем добавления директории с dll-ками в system path. Странно конечно, но cpath игнорится qlua.
Не найден модуль в файле .dll
 
При запуске модуля с подключением dll выдается ошибка
Код
error loading module 'connectorlib' from file 'C:\SBERBANK\QUIK\_mplattform\_connectorlib\build\release\connectorlib.dll':
    Не найден указанный модуль.

Cpath и path настроены как следует
Код
package.cpath = package.cpath .. ";C:\\SBERBANK\\QUIK\\_mplattform\\_connectorlib\\build\\release\\?.dll"
package.path = package.path .. ";C:\\SBERBANK\\QUIK\\_mplattform\\_connectorlib\\luascripts\\?.lua"
Dependency walker показывает доступность всех компонентов



Либа собрана под x32 как и сам quik. Версия квика - 7.19.3.1
Появилось это вероятно после сегодняшнего принудительного обновления винды.

До этого подключал аналогично boost к либе - все работало.
Страницы: 1
Наверх