Название: Объясните архитектуру постороения программы Отправлено: id2606 от Сентябрь 01, 2012, 07:33 Добрый день друзья!
Хочу разобраться в началах Qt. Был старый проект на чистом c++ под линух, но стало необходимо перевести его на Qt. (было все сделано по старинке, запуск тредов с while (true) внутри) Проект достаточно простой: это клиент для Web чата, в котором можно общаться только 1 на 1, но одновременно со многими (как ICQ). Принцип работы этого чата: Заходим на главную страницу, находим форму логина и делаем пост. 1 .Следом идем на страницу чата. http://example.com/chat.php на этой странице аяксом делаются запросы раз в 10 секунд и в ответ получает кто стукнулся в чат. ответ вида: jQuery({"im":{"users":[],"total_count":0,"flag_blink":0,"flag_beep":0}}) либо: jQuery({"im":{"users":{"6202162":{"count":1,"username":"Mananayaia","pair_hash":"DwYDB1ZXBx8HAVYFCVcF","uid_hash":"DwYDBVBTBA=="}},"total_count":1,"flag_blink":1,"flag_beep":1}}) если кто то стукнулся. Дале выстаскиваем uid_hash из предыдущего запроса и создаем новый вида: 2. http://example.com/chat_main.php?uid_hash=DwYDBVBTBA== Из полученого хтм вытаскиваем еще 1 парамерт auth_token и начинаем раз в 10 секунд выполнять запросы вида: 3. http://example.com/chat_msg.php?auth_data=blablablabal&uid_hash=DwYDBVBTBA== В ответ получаем Либо jQuery({"messages":[]}) либо jQuery({"messages":[{"message":"Hi","date_created":1346024185,"from":"6197964","to":"6202471"},{"message":"How are you? ?","date_created":1346024189,"from":"6197964","to":"6202471"}]}) Это значит нам написали два сообщения Hi и How are you? 4 чтобы отправить сообщение пользователю достаточно вызвать http://example.com/send_msg.php?auth_data=blablablabal&uid_hash=DwYDBVBTBA==&message=HELLOOOO!!!! Начал делать следущее. ChatModule public: int openChat() { открываем чат запускаем таймер с интервалом 10 секунд и конектим к слоту checkNewRewquest } slot: void checkNewRewquest() { берем страницу http://example.com/chat.php если находим новый запрос делаем emit newRequest(QString fromUser, QString token); } А теперь мне нужно в этом сигнале как-то сообщить Accept или Decline разговор. В случае Decline просто игнорируем все, а вот в случает Accept мне нужно выполнить пункты 2 и 3 (выше они) причем 3ий пункт нужно выполнять каждые N секунд и в случае появления нового сообщение сгененрировать например сигнал newMessage (QString from, QString message); И когда нужно, ответить ему своим сообщением (4 пункт) Дошел до этого места и у меня ничего не получается. Объясните правильно ли я вообще делаю, либо на Qt это нужно делать подругому. Я в принципе не понимаю как это реализовывать Может быть примеры дадите или сами накидаете каркас этой задачи. Уже 4 дня не могу сообразить. (когда писал на обычных сях проблем вообще не было) А тут не понятно, треды говорят использовать глупо. Название: Re: Объясните архитектуру постороения программы Отправлено: Igors от Сентябрь 01, 2012, 12:14 Вы предлагаете обсудить архитектуру, но при этом забиваете изложение спецификой Вашего проекта. В результате число возможных обсуждающих резко сужается, и шансы на плодотворное обсуждение резко падают.
Мне кажется что если Вы считаете это общим (о чем говорит само слово "архитектура") то надо убрать их изложения все связанное с конкретикой/спецификой - типа есть модули с таким-то функционалом, в 2 словах, а как оно реализовано - дело десятое и темой обсуждения не является. Каждый может рассказывать очень долго о своей предметной области, но здесь это никому не надо :) Название: Re: Объясните архитектуру постороения программы Отправлено: andrew.k от Сентябрь 01, 2012, 15:33 Вы предлагаете обсудить архитектуру, но при этом забиваете изложение спецификой Вашего проекта. В результате число возможных обсуждающих резко сужается, и шансы на плодотворное обсуждение резко падают. В точку! Я дочитал до "Принцип работы этого чата:"Мне кажется что если Вы считаете это общим (о чем говорит само слово "архитектура") то надо убрать их изложения все связанное с конкретикой/спецификой - типа есть модули с таким-то функционалом, в 2 словах, а как оно реализовано - дело десятое и темой обсуждения не является. Каждый может рассказывать очень долго о своей предметной области, но здесь это никому не надо :) Название: Re: Объясните архитектуру постороения программы Отправлено: andrew.k от Сентябрь 01, 2012, 15:39 Дошел до этого места и у меня ничего не получается. Объясните правильно ли я вообще делаю, либо на Qt это нужно делать подругому. Я в принципе не понимаю как это реализовывать Может быть примеры дадите или сами накидаете каркас этой задачи. Уже 4 дня не могу сообразить. (когда писал на обычных сях проблем вообще не было) А тут не понятно, треды говорят использовать глупо. Что конкретно тебе не понятно в этой статье? Название: Re: Объясните архитектуру постороения программы Отправлено: id2606 от Сентябрь 01, 2012, 17:17 Ребята, как раз эту статью я прочитал (а вообще их там две), но не могу реализовать. Щас объясню чуть ниже.
Вообще сверху описана не специфика моей программы, а как эта система работает в браузере. Т.е. я хочу чтобы вы объяснили архитектуру построения МОЕЙ программы для РЕАЛИЗАЦИИ вышестоящего примера. Потому что как только я начинаю применять все в своей проге я захожу в тупики После того как я прочитал статью я понял что я не правильно юзаю треды (я перегружал run) Начал делать как в статье код выгляит примерно так Код
slotProcessNewRequest это очередной while (true) с проверкой на новые сообщения. Все хорошо схема работает ЕСЛИ 1 ЧЕЛОВЕК написал. Когда пишет второй срабатывает опят код chatModule.moveToThread Но тут и ежу понятно что модуль не принадележит уже текущему треду а принадлежит thread! и все. Я тут опять встал в тупик. Название: Re: Объясните архитектуру постороения программы Отправлено: V1KT0P от Сентябрь 01, 2012, 17:25 Если ты только учишься программировать то просто делай как думаешь, затем ты что-то не сможешь сделать из-за изначально кривой архитектуры. Начнешь думать как это исправить и придешь к выводу что надо переписать все по другому. И на некоторой итерации переписывания к тебе придет озарение как надо делать правильно. И после этого к тебе будет приходить понимание как сразу делать правильно. Я когда начинал изучать программирование только с 5-го раза написал нормально работающую архитектуру для одной программы. И поверь это было не впустую потраченное время, благодаря тем 4-м неработающим версиям я больше на такие грабли никогда не наступлю =).
Название: Re: Объясните архитектуру постороения программы Отправлено: id2606 от Сентябрь 01, 2012, 17:56 Опыт программирования у меня очень большой (14 лет)
Написал огромное количество программ (c++ win23/linux, delphi, perl, php, даже на asm писал когда-то) Даже умудрился написать один огромный проект на Qt, но там все линейно и сделал как смог, как раз из-за кривизны начались косяки. Поэтому сейчас и прошу помощи в разъяснении как это ДОЛЖНО быть все построено. Если разберусь тут значит легко перепишу и там. Как раз проект вроде и простой в тоже самое время затрагивает те вещи которые я не понимаю как нужно сделать. (данный проект я написал на C++ голом с тредами за 1 день) Туда включался UserAgent и парсер html форм ( одни регекспы (: ), сейчас есть необходимость сделать его на Qt. А я как маленький мальчик не понимаю как (: Название: Re: Объясните архитектуру постороения программы Отправлено: V1KT0P от Сентябрь 01, 2012, 18:14 Начнем с того что сперва надо точно уяснить что тебе надо и что непонятно иначе будет говорить о разных вещах.
Если я правильно понял то задача такая: Получать и отсылать сообщение в веб. Я вижу это примерно вот так: 1) Окошко с чатом, при нажатии кнопки отправить генерируется сигнал SendMessge который отправляется в класс Chat, который в свою очередь работает в отдельном потоке. 2) В этом классе Chat создается таймер который раз в N секунд создает сигнал CheckNewMessages в класс Chat. 3) Chat же при появлении сообщения SendMessge отправляет сообщение на сервер. При появлении сообщения CheckNewMessages скачивает страничку и парсит, если нашел новые сообщения то отправляет их через сигнал в GUI. Вот теперь скажи что именно непонятно. Название: Re: Объясните архитектуру постороения программы Отправлено: id2606 от Сентябрь 01, 2012, 19:44 Задачу в общем ты понял правильно. Но для начала GIU ни какого не будет, будет просто объект который будет валить собщения в qDebug()
С отправкой сообщения никаких проблем вроде нет. А вот с проверкой на новые сообщение есть. 1 Создаем класс ChatModule cm ("username", "password"); 2 cm.login() 3 cm.startChat() в этой функции он запускает таймер (каждые 10 сек) и связывает его с со слотом checkNewRequests () 4 в checkNewRequests () выполняем запрос на страницу с чатом если там есть новый запрос мы генерируем сигнал например newRequest (QString from ) если нет ничего то ничего и не делаем. Зря начал писать. Создал пусто, но "работающий" пример файл в аттаче, я думаю на его примере мне будет все понятнее http://tomska.com/Chat.rar (http://tomska.com/Chat.rar) Название: Re: Объясните архитектуру постороения программы Отправлено: fuCtor от Сентябрь 16, 2012, 16:31 Может для начала обстрагироваться от языка и от инструментов в принципе? Попробуйте формализовать саму задачу, описать все сущности в UML. По полученным сущностям построить диаграммы последовательности для всех операций, причем сразу учитывать, что запросы то будут асинхронные, т.е. ответ уже прийдет в другую функцию (обработчик). Вот тогда гарантирую что большая часть вопросов отпадет, а те что останутся уже будут более конкретными и простыми для их решения.
|