Переписан CallbackHandler
This commit is contained in:
10
QuikPy.py
10
QuikPy.py
@@ -36,19 +36,25 @@ class QuikPy(metaclass=Singleton): # Singleton класс
|
|||||||
socketCallbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Соединение для функций обратного вызова
|
socketCallbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Соединение для функций обратного вызова
|
||||||
socketCallbacks.connect((self.Host, self.CallbacksPort)) # Открываем соединение для функций обратного вызова
|
socketCallbacks.connect((self.Host, self.CallbacksPort)) # Открываем соединение для функций обратного вызова
|
||||||
currentThread = threading.currentThread() # Получаем текущий поток
|
currentThread = threading.currentThread() # Получаем текущий поток
|
||||||
|
fragments = [] # Будем получать ответ в виде списка фрагментов. Они могут быть разной длины. Ответ может состоять из нескольких фрагментов
|
||||||
while getattr(currentThread, 'process', True): # Пока поток нужен
|
while getattr(currentThread, 'process', True): # Пока поток нужен
|
||||||
fragments = [] # Гораздо быстрее получать ответ в виде списка фрагментов
|
|
||||||
while True: # Пока есть что-то в буфере ответов
|
while True: # Пока есть что-то в буфере ответов
|
||||||
fragment = socketCallbacks.recv(self.bufferSize) # Читаем фрагмент из буфера
|
fragment = socketCallbacks.recv(self.bufferSize) # Читаем фрагмент из буфера
|
||||||
fragments.append(fragment.decode('cp1251')) # Переводим фрагмент в Windows кодировку 1251, добавляем в список
|
fragments.append(fragment.decode('cp1251')) # Переводим фрагмент в Windows кодировку 1251, добавляем в список
|
||||||
if len(fragment) < self.bufferSize: # Если в принятом фрагменте данных меньше чем размер буфера
|
if len(fragment) < self.bufferSize: # Если в принятом фрагменте данных меньше чем размер буфера
|
||||||
break # то это был последний фрагмент, выходим из чтения буфера
|
break # то, возможно, это был последний фрагмент, выходим из чтения буфера
|
||||||
data = ''.join(fragments) # Собираем список фрагментов в строку
|
data = ''.join(fragments) # Собираем список фрагментов в строку
|
||||||
dataList = data.split('\n') # Одновременно могут прийти несколько функций обратного вызова, разбираем их по одной
|
dataList = data.split('\n') # Одновременно могут прийти несколько функций обратного вызова, разбираем их по одной
|
||||||
|
fragments = [] # Сбрасываем фрагменты. Если последнюю строку не сможем разобрать, то занесем ее сюда
|
||||||
for data in dataList: # Пробегаемся по всем функциям обратного вызова
|
for data in dataList: # Пробегаемся по всем функциям обратного вызова
|
||||||
if data == '': # Если функция обратного вызова пустая
|
if data == '': # Если функция обратного вызова пустая
|
||||||
continue # то ее не разбираем, переходим на следующую функцию, дальше не продолжаем
|
continue # то ее не разбираем, переходим на следующую функцию, дальше не продолжаем
|
||||||
|
try: # Пробуем разобрать функцию обратного вызова
|
||||||
data = json.loads(data) # Возвращаем полученный ответ в формате JSON
|
data = json.loads(data) # Возвращаем полученный ответ в формате JSON
|
||||||
|
except json.decoder.JSONDecodeError: # Если разобрать не смогли (пришла не вся строка)
|
||||||
|
fragments.append(data) # то, что не разобрали ставим в список фрагментов
|
||||||
|
break # т.к. неполной может быть только последняя строка, то выходим из разбора функций обратного выходва
|
||||||
|
|
||||||
# Разбираем функцию обратного вызова QUIK LUA
|
# Разбираем функцию обратного вызова QUIK LUA
|
||||||
if data['cmd'] == 'OnFirm': # 1. Новая фирма
|
if data['cmd'] == 'OnFirm': # 1. Новая фирма
|
||||||
self.OnFirm(data)
|
self.OnFirm(data)
|
||||||
|
|||||||
Reference in New Issue
Block a user