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

Время приема датаграм qUDPSocket

01.10.2013, 10:48. Показов 1497. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый, уважаемые пользователи форума.
У меня такая проблема при работе с qUDPSocket. Есть устройство, которое шлет датаграмы. Я у себя в программе принимаю эти датаграмы так, как это описано в документации.
Устанавливаем соединение:
C++ (Qt)
1
connect(udpSocket_, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
Код слота:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void OperateController::processPendingDatagrams()
{
    QByteArray datagram;
    datagram.resize(udpSocket_->pendingDatagramSize());
    udpSocket_->readDatagram(datagram.data(), datagram.size());
    QDataStream in(&datagram, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_4_7);
    quint8 firstCommand = 0;
    in >> firstCommand;
    if(firstCommand == 8) {
        quint8 secondCommand = 0;
        in >> secondCommand;
        if(secondCommand == responseOperationController_) {
            in >> message_.unitShifterFirst >> message_.unitShifterSecond;
            in >> message_.attenuatorValueD1 >> message_.attenuatorValueD2 >> message_.attenuatorValueD4;
            in >> message_.voltageValueD1 >> message_.amperageValueD1 >> message_.voltageValueD2 >> message_.amperageValueD2;
            in >> message_.voltageValueD4 >> message_.amperageValueD4;
            //Здесь мы получаем значение необходимых нам битов
            clearWasteBits(3, message_.attenuatorValueD1);
            clearWasteBits(3, message_.attenuatorValueD2);
            clearWasteBits(3, message_.attenuatorValueD4);
            quint16 highByte = 0;
            quint16 littleByte = 0;
            littleByte = static_cast<quint16> (message_.unitShifterFirst);
            highByte = static_cast<quint16> (message_.unitShifterSecond) << 8;
            tactCount_ = littleByte + highByte;
            emit sendMessageKu(message_);
        }
    } 
}
В датаграмме содержится небольшая структура, в которой передаются некоторые параметры устройства. Устройство шлет датаграмы каждую миллисекунду. С помощью сниффера проверено, что сообщения приходят каждую миллисекунду. Но когда мы замеряем время в слоте считывания, то время получается не 1 мс, а разное от 100мкс до 3 мс.
Тут возникает вопросы. С чем связаны такие странные временные интервалы? Неужто qUDPSocket как-то странно принимает датаграмы, а затем отсылает сигналы? Я то надеялся, что сигнал будет каждую миллисекунду исходить.
Большое спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2013, 10:48
Ответы с готовыми решениями:

QUdpSocket. Как сделать время задержки 0,5 мс
Здравствуйте уважаемые. Передаю пакеты - 1032 байта в одном. Передаю 65525 пакетов. Надо передать не более чем за 32,7 секунды. ...

Как не засорять память при приёме датаграм
В общем, такое дело, решил посмотреть, сколько моя дорогая программа жрёт памяти и оказалось, что со временем, мягко говоря, съест много. ...

время ожидания приема соединения функцией accept
Здравствуйте! Ситуация: Сервер &quot;прослушивает&quot; порт, к которому подсоединился клиент, но функцию accept() не вызывает. Вопрос: ...

2
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
01.10.2013, 13:22
Цитата Сообщение от TazmanianDevil Посмотреть сообщение
С чем связаны такие странные временные интервалы?
а почитать про UDP совсем никак? ни кто не гарантирует, что сообщение будет приходить моментально, в той последовательности в которой посылались и что оно вообще дойдет...
Цитата Сообщение от TazmanianDevil Посмотреть сообщение
Я то надеялся, что сигнал будет каждую миллисекунду исходить.
ню...ню... наивно....
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.10.2013, 13:35
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
а почитать про UDP совсем никак? ни кто не гарантирует, что сообщение будет приходить моментально, в той последовательности в которой посылались и что оно вообще дойдет...
это не тот случай.

Цитата Сообщение от TazmanianDevil Посмотреть сообщение
Тут возникает вопросы. С чем связаны такие странные временные интервалы? Неужто qUDPSocket как-то странно принимает датаграмы, а затем отсылает сигналы? Я то надеялся, что сигнал будет каждую миллисекунду исходить.
Особенность реализации сокетов в Qt.
В Qt сокеты не блокирующие, а асинхронность осуществляется через EvenLoop и набор таймеров.
В подобных ситуациях следует выносить работу с сокетом в отдельный поток, что бы исключить воздействия UI, и делать через блокирующий режим, а лучше всего использовать boost asio или poco.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2013, 13:35
Помогаю со студенческими работами здесь

Panasonic kx-ft984 точное время приёма факса
Есть в офисе у нас такой аппарат: телефон-Факс Panasonic kx-ft984. Есть ли у него такая функция что бы на бумаге где то в углу печаталось...

С помощью датаграм (UDP) подсчитать, сколько копий программы запущено
Здравствуйте, нужен алгоритм для следующей задачи. Задачу я то уже сделал, но оказалось не так, как ожидал тот, кто ее дал. Нужно с...

Qudpsocket
День добрый. Возникла пара вопросов: 1. Можно ли в qt сокетах для udp как-то отследить состояние соединения? Как то так: 1)...

QUdpSocket
Всем привет не понял что я делаю не так, отправляю данные вот так bool UdpServer::initSocket(QHostAddress ip, uint16_t port) { ...

QUDPSocket + moveToThread
Не могу понять как реализовать данную связку. Если писать this то он ругается, мол нельзя управлять из одного потока если создан в другом....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru