Вопрос проектирования. |
Здравствуйте, гость ( Вход | Регистрация )
Вопрос проектирования. |
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 потоке чтобы при необходимости выводить читабельные сообщения. |
|
|
Текстовая версия | Сейчас: 28.12.2024, 10:31 |