Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/35: Рейтинг темы: голосов - 35, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28

Как организовать Messenger реального времени?

02.08.2014, 13:31. Показов 7082. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я хочу написать свой mesenger(хорошо бы мультипротокольный, но это потом). И у меня появилось несколько вопросов
1. Опыта разработки приложений реального времени абсолютно нет. Как они организованы? Все, что идет в голову это
C++
1
while(true) {/*основной цикл*/ sleep(300);}
2. Организация получения/отправки сообщений. Отправку и получение сообщений я знаю. Но как организовать это в приложении реального времени? У меня есть только 2 варианта(возможно оба неправильные )
а) На каждый протокол создать 2 нити(или потока по другому). Один на отправку, другой на получение. Как тогда организовать взаимодействие нитей с основной программой? Через сигналы?
б) В цикле программы просто поочередно получать/отправлять сообщения. Думаю, сообщения будут долго доходить.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.08.2014, 13:31
Ответы с готовыми решениями:

Как получать сигнал со звуковой карты в режиме реального времени?
Добрый день, хочу написать гитарный тюнер, сразу возник вопрос. Как можно получать сигнал с звуковой карты в режиме реального времени?

С в разработке систем реального времени
Здравствуйте! Не могли бы вы указать основные преимущества С в разработке СРВ? Возможно, есть места, где об этом можно прочитать?

Проектирование системы реального времени
Нужно смоделировать работу автозавода: Контролируемый объект- конвейер, где к кузову последовательно присоединяются двигатель, шасси,...

10
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
02.08.2014, 14:09
Насколько я понял, речь идёт о чём-то вроде ICQ клиента. Если так, то есть пара замечаний:

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

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

В-третьих, клиент на то и клиент, что бы отправлять запросы, а сервер на то и сервер, что бы на них отвечать.

Поэтому, даже при необходимости обновления истории сообщений в режиме реального времени, Вам достаточно завести таймер примерно на 50-500 мс (можно даже сделать такую настройку) и с соответствующей периодичностью отправлять запросы на сервер "А нет ли там новых сообщений". Геморроя куда меньше, а пользователь задержку в полсекунды всё равно не заметит.



PS: И ещё одна личная просьба: "Пожалуйста, не пихайте слипы куда попало, для этого ведь есть таймеры".
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
02.08.2014, 14:16  [ТС]
Я правильно все понял? Вместо цикла со sleep использовать повторяющийся сигнал alarm и поочередно получать/отправлять сообщения без нитей.
Чем вариант с нитями плох?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 14:17
hVoltage, откройте любую книжку по разработке сетевых приложений и посмотрите как реализуется клиент-серверное взаимодействие. Хинт: сокеты, select, poll/epoll.
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
02.08.2014, 14:25
Всё зависит от требуемого времени отклика и трудоёмкости реализации. Сделать таймер с калбеком куда проще, чем синхронизировать все ваши потоки (тем более если на отправку и приём каждого протокола заводить отдельный поток). А вот результат (для данной конкретной задачи) будет одинаковый. Вот если бы Вы писали не клиент, а сервер, то, при ожидании большой вычислительной нагрузки, создание разных потоков имело бы смысл, так как всем клиентам нужно ответить поскорее. Но даже в таком случае нужно понимать, что:

* При количестве потоков равном количеству ядер ЦП Вы достигнете максимально возможной производительности.
* При количестве потоков вдвое больше количества ядер ЦП, скорее всего, мало что изманится.
* А вот при дальнейшем увеличении количества потоков Вы получите экспоненциальное снижение производительности из-за того, что процессор слишком часто будет менять контекст, создавая избыточную нагрузку на ОЗУ (которая работает на порядок медленнее ЦП).
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
02.08.2014, 14:43  [ТС]
Понятно. Слишком большой труд ради небольшой производительности.
А вот при дальнейшем увеличении количества потоков Вы получите экспоненциальное снижение производительности из-за того, что процессор слишком часто будет менять контекст, создавая избыточную нагрузку на ОЗУ (которая работает на порядок медленнее ЦП).
Поток и процесс немного разные вещи. При переключении между потоками в рамках одного процесса, контекст не меняется и нагрузка при переключении небольшая.

Никак не могу понять про какой таймер вы говорите.
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
02.08.2014, 15:03
В ЦП есть встроенные таймеры, которые можно и из ассемблера вызвать, но не нужно, так как у них полно высокоуровневых обёрток, в том числе и в C++.
Цитата Сообщение от hVoltage Посмотреть сообщение
При переключении между потоками в рамках одного процесса, контекст не меняется
В процессоре куча регистров, кэш 1 уровня, конвейер команд, которые приходится перезагружать даже при смене потока, из-за чего происходят такие вещи как кэш-промахи и сброс конвейера команд (о смене процесса я вообще не говорю - это катастрофа для производительности). Поймите: все ваши выражения типа a = b + c и прочие операторы в ассемблере превращаются в операции с регистрами. Соответственно, даже для разных потоков в рамках одного процесса они разные и их нужно куда-то сгружать. С кэшем и командами примерно то-же. Плюс не забывайте, что ОЗУ медленнее ЦП и вся система работает слаженно только при условии, что заранее известно какие данные нужно загрузить из ОЗУ в кэш. Если Вы, вдруг, переключаетесь на другой поток, то вам нужны уже другие данные, а те, которые уже загружены в кэш не нужны.

Добавлено через 7 минут
Я имею ввиду те таймеры, которые спустя некоторое время вызывают калбек функцию. Если они реализованы за счет встроенных системных таймеров, то работать будут быстрее и, в отличие от слипа, не будут вешать поток на период ожидания. Сам я пишу на Qt поэтому сайчас так сходу не могу найти аналоги из стандартной библиотеки C++, но они там точно есть.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
02.08.2014, 15:14  [ТС]
В процессоре куча регистров, кэш 1 уровня, конвейер команд...
Знал, что смена регистров и прочего занимает время, но не знал, чтобы настолько.

Sigalrm, думаю, подойдет как таймер.

Не совсем понял на счет слипа. Что значит, что встроенные таймеры не вешают поток?
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
02.08.2014, 15:24
Слип останавливает поток на время, а таймеры с калбеком нет. После слипа программа продолжит выполнение с того же места. А по прерыванию таймера вызовется функция, адрес которой Вы, скорее всего, передали таймеру во время настройки.
Смена контекста потока занимает не так уж и много времени, но если потоков уж очень много наплодить (не забывайте, что Ваш процесс в системе не единственный) то не сложно добиться ситуации в которой время на переключение больше времени выполнения полезных действий.
И ещё пара ситуаций из моей практики, когда я хотел убить человека за слипы в коде:

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

2) Как то раз видел самодельный сервер БД, которые запускал sleep(100) когда ему было нечего делать. Соответственно повесить такую БД простейшей DDos атакой было проще простого.

3) есть ещё куча историй, но мне надо уезжать, так что в следующий раз расскажу.
1
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
02.08.2014, 15:28  [ТС]
Точно. Совсем забыл, что пользователь еще и сообщения будет вводить. Sigalrm самое оно, действительно.

Спасибо, что разъяснили.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
03.08.2014, 02:59
hVoltage, не надо слипов. И про таймеры пока подожди (но не откладывай, пригодятся). Сперва посмотри на функции select\poll\epoll (POSIX), WaitFor<Single\Multiple>Object (Win32API), на condition variable и по смежным ссылкам. Можно начать отсюда. Или отсюда. Потом сюда. Или сюда.

Добавлено через 2 минуты
Особенно хорошо расписано зачем это нужно и как применяется в мане по select. Даже если не используется unix, все равно рекомендую прочитать его целиком. Должно многое встать на места.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.08.2014, 02:59
Помогаю со студенческими работами здесь

Как сделать часы реального времени?
Помогите пожалуйста с одной проблемкой... Не знаю как сделать часы реального времени:-[ вообще задача в следующем: в диалоговом окне...

Как из реального времени вычесть время из базы
Кароче, в новостях нужно выводить время типа &quot;30 sec ago , 5 min ago и т.д.&quot; в базу к новости заносится реальное время. Как мне из...

Игровой цикл. Режим Реального времени. Как?
Привет! Немного кодил на С++, с SFML в том числе, там немного понял как внедрить в игру понятие времени. Т.е непрерывный игровой цикл...

Как выводить время в режиме реального времени?
Начал работать с Django. Создаем простую страничку,где выводиться текущее время и дата, время обновляется каждую секунду, например. ...

Visual studio С# и MySql как БД реального времени
Всем привет сразу прошу не быть со мной строго я не нашел похожей темы! Собираюсь создать сервер MySql(отдельный компьютер Windows 7) и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru