Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
19.06.2025, 10:31:12
Начало Помощь Поиск Войти Регистрация
Новости: ООО «Скрин маркет системз», правообладатель программы «Система брокерского обслуживания «TRANSAQ» официально заявляет, что не ведет никакой деятельности в мессенджерах или социальных сетях. 
Подробности на нашем сайте  WWW.TRANSAQ.RU.

Просмотр сообщений

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Сорвачев Сергей

Pages: 1 2 [3] 4
31
TRANSAQ Connector / Re: Время Жизни Сессии
« on: 15.03.2021, 13:52:50 »
Пришлите пожалуйста логи коннектора на support@transaq.ru, по ним можно будет судить что происходит.
Пример именования файлов, которые нас интересуют:
20210315_xdf.log
20210315_dsp.log
20210315_ts.log

32
TRANSAQ Connector / Re: Время Жизни Сессии
« on: 15.03.2021, 11:37:18 »
1. Такого понятия нет. Подключение к серверу активно пока клиент не будет отключен сервером или не отключится сам. Также отключения могут происходить из-за некоторых ошибок (например сетевых задержек и т.п.)
2. Без необходимости делать реконнект не следует
3. <server_status connected=false/> - признак потери/завершения подключения к серверу
4. Этот вопрос следует направить Вашему брокеру

33
TRANSAQ Connector / Re: FreeMemory и python
« on: 19.02.2021, 18:30:19 »
Пример полного класса-обертки для xmlconnector.dll

34
TRANSAQ Connector / Re: FreeMemory и python
« on: 19.02.2021, 18:26:03 »
Полагаю, что так:
XC_ENCODING = 'utf-8'
py_data = cast(data, c_char_p).value.decode(XC_ENCODING)

data - входной параметр вашей callback-функции
py_data - выходной объект-строка

35
TRANSAQ Connector / Re: FreeMemory и python
« on: 19.02.2021, 18:00:35 »
использование freememory делает непонятно что, ошибок не выдает, но код идущий после этого вызова не выполняется
какие-то проблемы с питоновским 'bytes' ?

В документации есть описание данной функции и ее сигнатуры. Функция выполняеточистку памяти, выделенной библиотекой. Возвращаемое значение - bool, параметр - unsigned char*.

Проблемы с написанием кода в питоне:

использование freememory делает непонятно что, ошибок не выдает, но код идущий после этого вызова не выполняется
какие-то проблемы с питоновским 'bytes' ?

dll = ctypes.WinDLL("txmlconnector64.dll")

def callback(incoming_msg):   
    print(etree.tostring(etree.XML(incoming_msg), pretty_print=True, encoding="utf-8").decode())
    dll.FreeMemory(incoming_msg)

callbackPrototype = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_char_p)
callbackPtr = callbackPrototype(callback)

В приведенном примере нет кода после dll.FreeMemory(incoming_msg).

вообще есть у кого-то хоть какието работающие примеры на питоне?
приходится извращаться с ctypes без особого понимания, что во что конвертируется...
документация отвратительная, примеры только на # - там сидеть копаться днями чтобы понять что к чему

TXmlConnector написан на C++ под Windows. Код на C#, Python и Java - авторское видение и адаптация под нужный автору язык.
Пример авторского видения:
    def __init__(self, path):
        self.__ucallback = None
        self.lib = windll.LoadLibrary(path)
        self.__SetFunctions()
        self.__SetCallback(self.__xcallback)

    def __SetFunctions(self):
        self.func_init = self.lib.Initialize
        self.func_init.restype = c_void_p
        self.func_uninit = self.lib.UnInitialize
        self.func_uninit.restype = c_void_p
        self.func_set_callback = self.lib.SetCallback
        self.func_set_callback.restype = c_bool
        self.func_send_cmd = self.lib.SendCommand
        self.func_send_cmd.restype = c_void_p
        self.func_free_mem = self.lib.FreeMemory
        self.func_free_mem.restype = c_bool
        self.func_service_info = self.lib.GetServiceInfo
        self.func_service_info.restype = c_int

    def SetUserCallback(self, fun) :
        self.__ucallback = fun

    def __SetCallback(self, func) :
        prototype = WINFUNCTYPE(c_bool, POINTER(c_ubyte))
        self.__callback_func = prototype(self.__xcallback)
        res = self.func_set_callback(self.__callback_func)
        if (not res) :
            print("Failed to set callback")

    def __xcallback(self, data):
        py_data = cast(data, c_char_p).value.decode(XC_ENCODING)
        self.func_free_mem(data)
        if (not self.__ucallback == None) :
         self.__ucallback(py_data)
        return 0

36
Вызовы callback`ов на данный момент идут из одного потока последовательно. То есть ответ - дожидается.

37
TRANSAQ Connector / Re: <bgo_buy></bgo_buy>
« on: 21.10.2020, 18:41:51 »
Пришлите пожалуйста xdf лог (необходимо установить уровень логирования loglevel=3 при вызове Initialize) на момент появления пустого bgo_buy на support@transaq.ru

38
TRANSAQ Connector / Re: <bgo_buy></bgo_buy>
« on: 05.10.2020, 14:03:35 »
Добрый день. Какую версию коннектора Вы использует?

39
В логах я проблем не увидел. Если проблема еще актуальна необходимо снять дамп процесса на момент зависания и прислать его нам. Еще было бы неплохо посмотреть Ваш код деинициализации и выгрузки библиотеки.

40
Логи на support@transaq.ru пришлите пожалуйста (dsp, xdf, ts)

41
Спасибо за ответы!
Буду разбираться дальше.
По поводу "глобальный идентификатор на каждый callback" отдельное спасибо.
Писать на C++ для меня ну вообще крайне сложно, с этим языком я пытаюсь разобраться очень давно и вообще никак не догоняю.

Можно, например, Python адаптировать под работу с txmlconnector`ом. Но в данном случае также придется мэтчить сишные типы с питоновскими.

42
У меня сложности в понимании коннектора возникли по сути не по самому коннектору, а его реализации на C#.
Эти сложности связаны с тем что библиотека txmlconnector написана на C++, у нее плюсовый интерфейсы и типы, которые при использовании в C# необходимо мэтчить ("маршаллить") с шарповыми.

[DllImport("txmlconnector.dll", CallingConvention = CallingConvention.StdCall)]
private static extern bool SetCallback(CallBackDelegate pCallback);
Это всего лишь декларация (описание) функции в языке C#, которая экспортируется из библиотеки txmlconnector. Вам ее особо понимать не надо, надо использовать саму функцию с указанным набором аргументов.

// тут понятно, делегируем функцию Колбек из библиотеки в свою функцию
Callback-функция - как можно догадаться, есть функция обратного вызова. То есть мы указываем библиотеке txmlconnector (см функцию SetCallback) что хотим получать данные от нее в нашу функцию, которую пишем в своем приложении. Данные, приходящие в колбек - это результаты выполнения запросов, которые пораждаются функцией SendCommand. Как callback-функция будет вызываться и откуда в ней берутся данные вас волновать не должно. Будем считать библиотеку черным ящиком, который что-то генерирует и оповещает нас об этом. Главное что нужно знать и это указано в документации - callback функцию нельзя блокировать на длительное время и делать в ней сложную обработку данных. То есть ее назначение принять данные и положить, например, в очередь для дальнейшей обработки.
Из документации:
"В callback функции не должны выполняться операции, которые могут заблокировать поток на длительное время. Также из callback функции не следует вызывать управляющие функции библиотеки: Initialize, UnInitialize, SetCallback, SetCallbackEx, SendCommand, так как это может привести к взаимной блокировке потоков библиотеки."

// тут не понятно что же такое IntPtr, поискал почитал понятнее не стало использую как есть без понимания
Это шарповый тип, который представляет из себя указатель. Так как в C# нет указателей, как в C++, их надо мэппить на шарповые типы.
Их MSDN: "Тип IntPtr может использоваться языками, поддерживающими указатели, и как распространенный способ обращения к данным между языками, которые не поддерживают указатели."
Пример маршаллинга класса: https://www.codeproject.com/Articles/18032/How-to-Marshal-a-C-Class

Возможно есть какой-то другой более простой способ
Пишите на C++. Как минимум потребность в маршаллинге исчезнет.

Вопрос к разработчикам.
Такой возможности нет. Есть возможность (см. функцию SetCallback) задать глобальный идентификатор на каждый callback (это сделано для проектов, в которых несколько библиотек пишут в одну callback-функцию).

43
Добрый день.
узнать, закончилось ли поступление начальных данных после соединения с сервером?
Об окончании стартапа можно судить по появлению элемента <server_status connected=true>.

Еще вопрос по начальным данным - что это за элементы: Sec_info_upd и pits?
pit - Параметры инструмента в режиме торгов
sec_info_upd - Обновление информации по инструменту

или каждый раз все элементы xml будут располагаться в новом порядке?
Порядок появления элементов не регламентирован. Более того, некоторые из них вообще могут отсутствовать.

Более подробную информацию по вышеперечисленным структурам Вы можете найти в документации.

44
Ваш вопрос не очень понятен. Вы хотите услышать что при общей небезопасности коннектора относительно многопоточности функция FreeMemory потокобезопасна?  На данный момент да, как будет дальше - гарантий нет. Данную функцию зовет пользователь, при условии что он знает об ограничениях библиотеки, ничего не мешает ему синхронизировать вызовы функций и не звать их из нескольких потоков. Библиотека же не заставляет вас вызывать FreeMemory в колбэк-функции.

45
Библиотека TXmlConnector не рассчитана на работу в многопоточном режиме. Каждый вызов любой функции должен быть синхронизирован.

Pages: 1 2 [3] 4


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!