|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
|
||||||
Как организовать Messenger реального времени?02.08.2014, 13:31. Показов 7026. Ответов 10
Метки нет (Все метки)
Здравствуйте. Я хочу написать свой mesenger(хорошо бы мультипротокольный, но это потом). И у меня появилось несколько вопросов
1. Опыта разработки приложений реального времени абсолютно нет. Как они организованы? Все, что идет в голову это
) а) На каждый протокол создать 2 нити(или потока по другому). Один на отправку, другой на получение. Как тогда организовать взаимодействие нитей с основной программой? Через сигналы? б) В цикле программы просто поочередно получать/отправлять сообщения. Думаю, сообщения будут долго доходить.
0
|
||||||
| 02.08.2014, 13:31 | |
|
Ответы с готовыми решениями:
10
С в разработке систем реального времени Проектирование системы реального времени |
| 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
|
|
| 02.08.2014, 14:25 | |
|
Всё зависит от требуемого времени отклика и трудоёмкости реализации. Сделать таймер с калбеком куда проще, чем синхронизировать все ваши потоки (тем более если на отправку и приём каждого протокола заводить отдельный поток). А вот результат (для данной конкретной задачи) будет одинаковый. Вот если бы Вы писали не клиент, а сервер, то, при ожидании большой вычислительной нагрузки, создание разных потоков имело бы смысл, так как всем клиентам нужно ответить поскорее. Но даже в таком случае нужно понимать, что:
* При количестве потоков равном количеству ядер ЦП Вы достигнете максимально возможной производительности. * При количестве потоков вдвое больше количества ядер ЦП, скорее всего, мало что изманится. * А вот при дальнейшем увеличении количества потоков Вы получите экспоненциальное снижение производительности из-за того, что процессор слишком часто будет менять контекст, создавая избыточную нагрузку на ОЗУ (которая работает на порядок медленнее ЦП).
0
|
|
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
|
||
| 02.08.2014, 14:43 [ТС] | ||
|
Понятно. Слишком большой труд ради небольшой производительности.
Никак не могу понять про какой таймер вы говорите.
0
|
||
| 02.08.2014, 15:03 | ||
|
В ЦП есть встроенные таймеры, которые можно и из ассемблера вызвать, но не нужно, так как у них полно высокоуровневых обёрток, в том числе и в C++.
Добавлено через 7 минут Я имею ввиду те таймеры, которые спустя некоторое время вызывают калбек функцию. Если они реализованы за счет встроенных системных таймеров, то работать будут быстрее и, в отличие от слипа, не будут вешать поток на период ожидания. Сам я пишу на Qt поэтому сайчас так сходу не могу найти аналоги из стандартной библиотеки C++, но они там точно есть.
0
|
||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
|
||
| 02.08.2014, 15:14 [ТС] | ||
Sigalrm, думаю, подойдет как таймер. Не совсем понял на счет слипа. Что значит, что встроенные таймеры не вешают поток?
0
|
||
| 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
|
|
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 03.08.2014, 02:59 | |
|
hVoltage, не надо слипов. И про таймеры пока подожди (но не откладывай, пригодятся). Сперва посмотри на функции select\poll\epoll (POSIX), WaitFor<Single\Multiple>Object (Win32API), на condition variable и по смежным ссылкам. Можно начать отсюда. Или отсюда. Потом сюда. Или сюда.
Добавлено через 2 минуты Особенно хорошо расписано зачем это нужно и как применяется в мане по select. Даже если не используется unix, все равно рекомендую прочитать его целиком. Должно многое встать на места.
1
|
|
| 03.08.2014, 02:59 | |
|
Помогаю со студенческими работами здесь
11
Как сделать часы реального времени? Как из реального времени вычесть время из базы Игровой цикл. Режим Реального времени. Как? Как выводить время в режиме реального времени? Visual studio С# и MySql как БД реального времени Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|