В слот не приходят данные странным образом
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.02.21 07:08
Оценка:
Здравствуйте!

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

Есть сетевой запрос, он отрабатывается, его результаты дампятся — там данные есть. Он у него есть сигналы complete и error. Они приконнекчены к методам моего базового класса onComplete и onError. onComplete — перегруженная виртуальная функция. Есть класс template<ValueType> Clild, в котором оверрайдится одна из версии onComplete( ValueType v ). Connect с объектом запроса я делаю в дочернем классе с использованием qOverload.

И вот что странное. На двух машинах происходит по разному. На одной обработчик вызывается, и данные в него приходят, на другой — вызывается, но с пустыми данными.

Сорцы — одинаковые.
Версия Qt — и там и там 5.14.0 (даже лежат по одинаковому пути)
Студия MSVC 2017 — код работает на версии 15.9.9 и не работает на 15.9.22 (обновил до .32) — не помогло.

Других отличий я не нашел.

Вот что это может такое быть?

ЗЫ Буду искать, откуда этот сигнал вызывается, попробую там посмотреть.

ЗЫЫ Ответы с данными могут быть довольно жирными — несколько тыщь десериализованного из JSON барахла с подобъектами — думал, может он через кутишную очередь, через которую сигналы зовутся, не пролезает. Переделал на onComplete( const ValueType &v ) — не помогло. Кстати, а в слотах нормально принимать данные по ссылке, ничего не поломается?
Маньяк Робокряк колесит по городу
Re: В слот не приходят данные странным образом
От: AlexGin Беларусь  
Дата: 10.02.21 10:56
Оценка:
Здравствуйте, Marty, Вы писали:

M>И вот что странное. На двух машинах происходит по разному. На одной обработчик вызывается, и данные в него приходят, на другой — вызывается, но с пустыми данными.

Утилитой Wireshark пробовал? Показывает одинаковые приходящие по сети пакеты по обоих машинах?

M>Сорцы — одинаковые.

M>Версия Qt — и там и там 5.14.0 (даже лежат по одинаковому пути)
M>Студия MSVC 2017 — код работает на версии 15.9.9 и не работает на 15.9.22 (обновил до .32) — не помогло.
Скорее всего — причина не в этом.

M>Других отличий я не нашел.

M>Вот что это может такое быть?
Я не ясновидящий
Мало информации для выводов.

M>ЗЫ Буду искать, откуда этот сигнал вызывается, попробую там посмотреть.


M>ЗЫЫ Ответы с данными могут быть довольно жирными — несколько тыщь десериализованного из JSON барахла с подобъектами — думал, может он через кутишную очередь, через которую сигналы зовутся, не пролезает. Переделал на onComplete( const ValueType &v ) — не помогло. Кстати, а в слотах нормально принимать данные по ссылке, ничего не поломается?


Сырые данные (данные из канала) — присутствуют? Тот же JSON — просмматривается на проблемной машине корректно или нет?

Если ссылка — осталась валидной от генерации сигнала, до отработки слота — то всё должно нормально работать.
Хотя конечно, надо убедиться в том факте, что ссылка не оказалась битой при входе в обработчик слота.

P.S. Даже и "несколько тыщь десериализованного из JSON барахла с подобъектами" не та величина,
которой в современной технике нужно бояться. Это вполне можно было передавать и без ссылки.

Кстати — как часто в реальности приходит такой запрос? Если очень часто (несколько раз в секунду) — может проблема в частом выделении памяти в куче?
Отредактировано 10.02.2021 11:09 AlexGin . Предыдущая версия . Еще …
Отредактировано 10.02.2021 11:04 AlexGin . Предыдущая версия .
Re: В слот не приходят данные странным образом
От: XOOIOOX  
Дата: 10.02.21 11:05
Оценка:
Здравствуйте, Marty, Вы писали:

M>Connect с объектом запроса я делаю в дочернем классе с использованием qOverload.


M>Вот что это может такое быть?


Новый синтаксис соединения или старый?
Q_DECLARE_METATYPE и qRegisterMetaType сделал?
Re[2]: В слот не приходят данные странным образом
От: XOOIOOX  
Дата: 10.02.21 11:11
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Кстати — как часто в реальности приходит такой запрос? Если очень часто (несколько раз в секунду) — может проблема в частом выделении памяти в куче?


Аллокации разве что поток морозить будут. Теряться ничего не должно.
Re: В слот не приходят данные странным образом
От: SaZ  
Дата: 10.02.21 11:23
Оценка:
Здравствуйте, Marty, Вы писали:

M>Есть сетевой запрос, он отрабатывается, его результаты дампятся — там данные есть. Он у него есть сигналы complete и error. Они приконнекчены к методам моего базового класса onComplete и onError. onComplete — перегруженная виртуальная функция. Есть класс template<ValueType> Clild, в котором оверрайдится одна из версии onComplete( ValueType v ). Connect с объектом запроса я делаю в дочернем классе с использованием qOverload.


M>И вот что странное. На двух машинах происходит по разному. На одной обработчик вызывается, и данные в него приходят, на другой — вызывается, но с пустыми данными.


А у вас не может быть фрагментации пакетов? Может код, ответственный за получение данных неправильно их склеивает?
Если сеть самописная, то надо это учитывать. То есть один write на сервере может вызвать несколько read на клиенте.


M>ЗЫЫ Ответы с данными могут быть довольно жирными — несколько тыщь десериализованного из JSON барахла с подобъектами — думал, может он через кутишную очередь, через которую сигналы зовутся, не пролезает. Переделал на onComplete( const ValueType &v ) — не помогло. Кстати, а в слотах нормально принимать данные по ссылке, ничего не поломается?


Передача по ссылке будет только если у вас прямое соединение либо сигнал и слот в одном потоке. Если же соедение идет через queued connection либо в другой поток, то всегда данные будут копироваться и передаваться через очередь событий.
Re: В слот не приходят данные странным образом
От: Skorodum Россия  
Дата: 11.02.21 12:46
Оценка: +1
Здравствуйте, Marty, Вы писали:

Я бы начал с того, что полностью исключил сеть и работал бы с синтетическими данными.
Посылайте данные по таймеру.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.