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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объясните архитектуру постороения программы  (Прочитано 6281 раз)
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 дня не могу сообразить. (когда писал на обычных сях проблем вообще не было)

А тут не понятно, треды говорят использовать глупо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Сентябрь 01, 2012, 12:14 »

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

Мне кажется что если Вы считаете это общим (о чем говорит само слово "архитектура") то надо убрать их изложения все связанное с конкретикой/спецификой - типа есть модули с таким-то функционалом, в 2 словах, а как оно реализовано - дело десятое и темой обсуждения не является. Каждый может рассказывать очень долго о своей предметной области, но здесь это никому не надо  Улыбающийся
Записан
andrew.k
Гость
« Ответ #2 : Сентябрь 01, 2012, 15:33 »

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

Мне кажется что если Вы считаете это общим (о чем говорит само слово "архитектура") то надо убрать их изложения все связанное с конкретикой/спецификой - типа есть модули с таким-то функционалом, в 2 словах, а как оно реализовано - дело десятое и темой обсуждения не является. Каждый может рассказывать очень долго о своей предметной области, но здесь это никому не надо  Улыбающийся
В точку! Я дочитал до "Принцип работы этого чата:"
Записан
andrew.k
Гость
« Ответ #3 : Сентябрь 01, 2012, 15:39 »


Дошел до этого места и у меня ничего не получается. Объясните правильно ли я вообще делаю, либо на Qt это нужно делать подругому. Я в принципе не понимаю как это реализовывать Может быть примеры дадите или сами накидаете каркас этой задачи. Уже 4 дня не могу сообразить. (когда писал на обычных сях проблем вообще не было)

А тут не понятно, треды говорят использовать глупо.
Первая же ссылка в гугле твоя!
Что конкретно тебе не понятно в этой статье?
Записан
id2606
Гость
« Ответ #4 : Сентябрь 01, 2012, 17:17 »

Ребята, как раз эту статью я прочитал (а вообще их там две), но не могу реализовать. Щас объясню чуть ниже.

Вообще сверху описана не специфика моей программы, а как эта система работает в браузере. Т.е. я хочу чтобы вы объяснили архитектуру построения МОЕЙ программы для РЕАЛИЗАЦИИ вышестоящего примера. Потому что как только я начинаю применять все в своей проге я захожу в тупики

После того как я прочитал статью я понял что я не правильно юзаю треды (я перегружал run)
Начал делать как в статье код выгляит примерно так
Код
C++ (Qt)
while (true)
{
 
if (chatmodule.checkNewRequest())
{
  QThread *thread = new QThread;
  chatModule.moveToThread (thread);
  connect (thread, SIGNAL(started()), &chatModule, SLOT(processNewRequest()));
 
}
 
Тут задержка через QEventLoop И QTime::singleShot
}

slotProcessNewRequest это очередной while (true) с проверкой на новые сообщения.

Все хорошо схема работает ЕСЛИ 1 ЧЕЛОВЕК написал.
Когда пишет второй срабатывает опят код chatModule.moveToThread Но тут и ежу понятно что модуль не принадележит уже текущему треду а принадлежит thread! и все. Я тут опять встал в тупик.
« Последнее редактирование: Сентябрь 01, 2012, 17:19 от id2606 » Записан
V1KT0P
Гость
« Ответ #5 : Сентябрь 01, 2012, 17:25 »

Если ты только учишься программировать то просто делай как думаешь, затем ты что-то не сможешь сделать из-за изначально кривой архитектуры. Начнешь думать как это исправить и придешь к выводу что надо переписать все по другому. И на некоторой итерации переписывания к тебе придет озарение как надо делать правильно. И после этого к тебе будет приходить понимание как сразу делать правильно. Я когда начинал изучать программирование только с 5-го раза написал нормально работающую архитектуру для одной программы. И поверь это было не впустую потраченное время, благодаря тем 4-м неработающим версиям я больше на такие грабли никогда не наступлю =).
Записан
id2606
Гость
« Ответ #6 : Сентябрь 01, 2012, 17:56 »

Опыт программирования у меня очень большой (14 лет)
Написал огромное количество программ (c++ win23/linux, delphi, perl, php, даже на asm писал когда-то)
Даже умудрился написать один огромный проект на Qt, но там все линейно и сделал как смог, как раз из-за кривизны начались косяки. Поэтому сейчас и прошу помощи в разъяснении как это ДОЛЖНО быть все построено.
Если разберусь тут значит легко перепишу и там.

Как раз проект вроде и простой в тоже самое время затрагивает те вещи которые я не понимаю как нужно сделать. (данный проект я написал на C++ голом с тредами за 1 день) Туда включался UserAgent  и парсер html форм ( одни регекспы (: ), сейчас есть необходимость сделать его на Qt. А я как маленький мальчик не понимаю как (:
Записан
V1KT0P
Гость
« Ответ #7 : Сентябрь 01, 2012, 18:14 »

Начнем с того что сперва надо точно уяснить что тебе надо и что непонятно иначе будет говорить о разных вещах.
Если я правильно понял то задача такая: Получать и отсылать сообщение в веб.

Я вижу это примерно вот так:
1) Окошко с чатом, при нажатии кнопки отправить генерируется сигнал SendMessge который отправляется в класс Chat, который в свою очередь работает в отдельном потоке.
2) В этом классе Chat создается таймер который раз в N секунд создает сигнал CheckNewMessages в класс Chat.
3) Chat же при появлении сообщения SendMessge отправляет сообщение на сервер. При появлении сообщения CheckNewMessages скачивает страничку и парсит, если нашел новые сообщения то отправляет их через сигнал в GUI.

Вот теперь скажи что именно непонятно.
Записан
id2606
Гость
« Ответ #8 : Сентябрь 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
Записан
fuCtor
Гость
« Ответ #9 : Сентябрь 16, 2012, 16:31 »

Может для начала обстрагироваться от языка и от инструментов в принципе? Попробуйте формализовать саму задачу, описать все сущности в UML. По полученным сущностям построить диаграммы последовательности для всех операций,  причем сразу учитывать, что запросы то будут асинхронные, т.е. ответ уже прийдет в другую функцию (обработчик). Вот тогда гарантирую что большая часть вопросов отпадет, а те что останутся уже будут более конкретными и простыми для их решения.
« Последнее редактирование: Сентябрь 16, 2012, 16:34 от fuCtor » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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