Russian Qt Forum
Ноябрь 22, 2024, 19:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проверка синхронности данных по каналам  (Прочитано 5087 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Март 25, 2016, 12:59 »

Привет. Есть некоторые объекты , наследники от QObject, состояния которых приходит по сети в json (хотя не суть важно).
У объектов есть свойства, некоторые булевые, некоторые целочисленные, перечисления, float и строковые. Ну например
Код:
class StateObject : public QObject {
Q_PROPERTY (bool prop1 ...)
Q_PROPERTY (bool prop2 ...)
Q_PROPERTY (int prop3 ...)
Q_PROPERTY (float prop4 ...)
Q_PROPERTY (QString prop5 ...)
Q_PROPERTY (some_enum prop6 ...)
...
}
Состояние этого объекта обновляется несколько раз в секунду на основании данных с сети, парсится json, и обновляются свойства объекта, после чего его свойства уже читаются другими объектами.
Так вот, у меня 4 сетевых канала данных, по которым приходят состояния этого объекта. Иногда наблюдается рассинхронизация данных, например prop1 по одному каналу false, по остальным трем true.
Мне нужно проверять каждую секунду синхронность состояний StateObject. На каждое сетевое подключение свой экземпляр StateObject.
Таких объектов на самом деле много (тысячи). Но не все меняют свое состояние часто, одни периодически, одни асинхронно по событиям извне.
Так вот, сейчас синхронность проверяется тупым перебором свойств и сравниванием их значений. Я подумал, может есть более элегантное решение, например для каждого StateObject вычислять хеш его состояния на основании его свойств при каждом изменении, а дальше просто сравнивать их хеши. Нужно подобрать оптимальный вариант в плане производительности. Полагаю тупой перебор свойств у четырех экземпляров StateObject и сравнение QVariant не самое оптимальное решение.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Март 25, 2016, 13:53 »

Так вот, у меня 4 сетевых канала данных, по которым приходят состояния этого объекта. Иногда наблюдается рассинхронизация данных, например prop1 по одному каналу false, по остальным трем true.

а разве это проблема принимающего класса StateObject ?
ктото из сети ему дает неверные состояния ?

На каждое сетевое подключение свой экземпляр StateObject.

а почему бы не одно подключение (экземпляр StateObject) на 0.0.0.0 ?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Март 25, 2016, 15:54 »

Есть два шкафа оборудования. Они дублируют друг друга. Типа горячий резерв.
К каждому шкафу подключено по два сервера.
Т.е. система два по два. Итого 4 канала. Т.к. в любой момент может выйти из строя один из шкафов или один из серверов, была выбрана такая вот схема.
К сожалению столкнулись с тем, что временами наблюдается рассинхронизация данных, которая возникает из за сетевых задержек, глюков оборудования и т.п.
В текущий момент пользователь видит данные только с одного канала, остальные как бы в горячем резерве. Если канал отваливается, происходит переключение на следующий.
Так вот, возникли ситуации, когда данные по некоторым объектам были в определенные периоды разными. Опустим здесь изъяны архитектуры, к сожалению я не могу на это повлиять,
каналы должны быть независимыми друг от друга. Поэтому конечная точка сведения данных моя программа. При возникновении рассинхрона, пользователю будет выдано об этом сообщение,
что бы он мог переключаться вручную, и смотреть какие данные по каким кланам в текущий момент.
Пока вроде с простым перебором свойств нагрузка на проц не очень большая, в пределах 1-2% на core i7 4770. Исполнительное оборудование по проще, core i5 второго поколения.
Просто я догадываюсь, что есть более изящные способы проверки. Как я упоминал выше, например расчёт хеша для каждого StateObject. Но как єто отразится на производительности.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Март 25, 2016, 16:42 »

да, сложно сказать не знаю эту вашу архитектуру, которую нельзя менять
а если поступающие значения не сразу выдавать дальше, а задержать их на пару секунд для синхрона ?
всеже постоянный пересчет выглядит как уж совсем костыль
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 22.