crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вопрос проектирования.
bzzz
  опции профиля:
сообщение 17.12.2010, 16:20
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 27.10.2010
Пользователь №: 2157

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет, возник следующий вопрос...

Разрабатываю gui приложение на Qt которое подключается к удалённом серверу и запрашивает у него данные. Приложение многопоточное - главный gui поток и сетевой поток, который держит связь с сервером, обрабатывает приходящие запросы и ответы. Для того чтобы общаться с сервером используется потоконебезопасная библиотека, в связи с чем весь парсинг ответов и запросов к серверу идёт внутри сетевого потока.

Что из себя представляет сетевой поток - класс QThread + класс Communicator который подключается и отключается от сервера когда ему передают сигнал connectToServer(..) или disconnectFromServer() соответственно. Так же этот класс принимает некоторый класс команды Command в котором содержатся запрос Request и ответ Response.

Так как ответы и запросы парсятся спец либой, то при получении ответа Response парсит его, а при отправке ответа сперва парсим Request.

Выполнение команды происходит так: создаём специализированные классы наследованные от Request и Response, передаём их в Command и отсылаем Communicator. Тот вытягивает из Command Request, вызывает метод parse, после чего пишет в сокет данные. Потом получив из сокета данные читает их, записывает в Response, вызывает для Response parse(), тот как-то обрабатывает результаты, после чего помечает команду как выполненную и отправляет Command назад функции которая была связана с командой.

А вот тут и начинается проблема посколько при получении команды в gui потоке мы не имеем данных о конкретных типах Requesta и Responsa хотя и знаем что они должны быть определёнными. Соответственно сейчас я использую dunamic_cast и дальше уже работаю с конкретными классами Requesta и Responsa что не является красивым решением имхо=( А самое паршивое, что я храню полученные результаты работы Responsa в самом Response, а иногда эти данные необходимо загонять в модель. что становится совсем не красивым=( (Поясню.. например в работе сервера произошла ошибка и эта ошибка представима в виде небольшого дерева 2-3 вложенности.. я загоняю это дело в модель, а после того как commanda пришла обратно в gui поток вытаскиваю указатель на модель из responsa и отдаю его диалогу, который сам же её после показа и удаляет (естественно перед показом response освобождает модель))

И пока как сделать это более правильно не знаю=(

Скажите пожалуйста как лучше спроектировать этот участок?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bzzz
  опции профиля:
сообщение 20.12.2010, 11:02
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 27.10.2010
Пользователь №: 2157

Спасибо сказали: 0 раз(а)




Репутация:   0  


мда...
в общем пришёл к тому, чтобы в каждый из responsov поместить ссылку на обработчик - handler + хранить сами запросы в gui потоке чтобы при необходимости выводить читабельные сообщения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.12.2024, 12:54