Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
202 / 148 / 5
Регистрация: 14.03.2013
Сообщений: 784
1

QUdpSocket. Как сделать время задержки 0,5 мс

11.02.2014, 10:51. Просмотров 2149. Ответов 11
Метки нет (Все метки)

Здравствуйте уважаемые.

Передаю пакеты - 1032 байта в одном. Передаю 65525 пакетов. Надо передать не более чем за 32,7 секунды.

При передачи теряются пакеты - не мало (в районе 15000) - это если непрерывно без задержек.
Если ставить таймер 1 мс - то теряется 5 пакетов, но по времени не попадаю.

p.s. udpSocket->waitForBytesWritten(1000); - не могу понять почему не работает функция?

Как сделать время задержки 0,5 мс (Работать будет программа под Linux)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2014, 10:51
Ответы с готовыми решениями:

Время приема датаграм qUDPSocket
День добрый, уважаемые пользователи форума. У меня такая проблема при работе с qUDPSocket. Есть...

Как задать каждой картинке свое время задержки?
<script language="JavaScript"> imgnum=0 // Начальные значения рисунков slideimg=new Array()...

Разное время задержки
Здравствуйте. Такая проблема, есть функция, которая должна выполняться каждые N минут. Причем...

Время задержки delay
Доброго времени суток. столкнулся с AnyLogic University 6.9.0. задача: Есть 3 блока Sourсе. из них...

11
594 / 394 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
11.02.2014, 11:16 2
Цитата Сообщение от Bmg113 Посмотреть сообщение
Как сделать время задержки 0,5 мс
А это вообще возможно?
0
202 / 148 / 5
Регистрация: 14.03.2013
Сообщений: 784
11.02.2014, 11:35  [ТС] 3
Цитата Сообщение от alexey_rage Посмотреть сообщение
А это вообще возможно?
Думаю что да. Пока читаю вот эти функции. Правда они под windows.
QueryPerformanceCounter -- это что-то вроде тактов
QueryPerformanceFrequency -- это такты в секунду
0
594 / 394 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
11.02.2014, 11:42 4
Если получится реализовать, расскажи пожалуйста, как сделал. Очень интересно.
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
11.02.2014, 11:57 5
Цитата Сообщение от Bmg113 Посмотреть сообщение
p.s. udpSocket->waitForBytesWritten(1000); - не могу понять почему не работает функция?
эта функция не делает задержку, они просто ждёт чтения указанное количество времени, если за это время читать нечего она идёт дальше.
Я думаю вам нужно попробовать QThread::msleep()
1
202 / 148 / 5
Регистрация: 14.03.2013
Сообщений: 784
11.02.2014, 12:01  [ТС] 6
Цитата Сообщение от OrmaJever Посмотреть сообщение
эта функция не делает задержку, они просто ждёт чтения указанное количество времени, если за это время читать нечего она идёт дальше.
Я думаю вам нужно попробовать QThread::msleep()
вы наверно имели ввиду QThread::usleep();
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
11.02.2014, 12:25 7
Вы ну сами выберите какие нужны задержки, я просто намекнул
1
202 / 148 / 5
Регистрация: 14.03.2013
Сообщений: 784
11.02.2014, 14:11  [ТС] 8
Цитата Сообщение от OrmaJever Посмотреть сообщение
Вы ну сами выберите какие нужны задержки, я просто намекнул
Я ставил и QThread::usleep(100); и QThread::usleep(500);
А он в конечном счете все равно показывает общее время как при QTimer::start(1), тоесть 1 мс. Или в Windows эти функции не работают?

Добавлено через 1 час 29 минут
Я конечно понимаю что у UDP нет достоверной отправки пакета. Но может можно как то интервал между пакетами увеличить?
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
11.02.2014, 15:59 9
Стабильных 0.5мс не получится хотя бы из-за переключения процессов.
Так что правильней просто паковать несколько кусков данных в один пакет и увеличить буфера принимающего сокета.
Впрочем, всё равно гарантировать доставку всех udp-пакетов нельзя никогда, протокол для этого просто не предназначен.
0
202 / 148 / 5
Регистрация: 14.03.2013
Сообщений: 784
11.02.2014, 17:18  [ТС] 10
Цитата Сообщение от NoMasters Посмотреть сообщение
Стабильных 0.5мс не получится хотя бы из-за переключения процессов.
Так что правильней просто паковать несколько кусков данных в один пакет и увеличить буфера принимающего сокета.
Впрочем, всё равно гарантировать доставку всех udp-пакетов нельзя никогда, протокол для этого просто не предназначен.
Подскажите а как увеличить буфер?

Добавлено через 7 минут
Цитата Сообщение от alexey_rage Посмотреть сообщение
Если получится реализовать, расскажи пожалуйста, как сделал. Очень интересно.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int MySleep (int nsec)
{
    LARGE_INTEGER freq,step,start;
    
    QueryPerformanceCounter(&start);
    QueryPerformanceFrequency(&freq);
    freq.QuadPart = freq.QuadPart/1000000;
    
    int time_sleep;
    do
    {
        QueryPerformanceCounter(&step);
        time_sleep = (step.QuadPart / freq.QuadPart) - (start.QuadPart / freq.QuadPart);
    }while(time_sleep<nsec);
    return time_sleep;
}
примерно так.

Добавлено через 26 минут
Цитата Сообщение от NoMasters Посмотреть сообщение
Стабильных 0.5мс не получится хотя бы из-за переключения процессов.
Так что правильней просто паковать несколько кусков данных в один пакет и увеличить буфера принимающего сокета.
Впрочем, всё равно гарантировать доставку всех udp-пакетов нельзя никогда, протокол для этого просто не предназначен.
И подскажите еще как можно реализовать самую простую гарантия доставки (в плане если не пришел пакет то заново отправить).
1
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
11.02.2014, 23:00 11
Цитата Сообщение от Bmg113 Посмотреть сообщение
Подскажите а как увеличить буфер?
Для линуксов можно почитать man 7 socket, внимание на SO_RCVBUF и соответствующее ограничение в /proc.
Цитата Сообщение от Bmg113 Посмотреть сообщение
И подскажите еще как можно реализовать самую простую гарантия доставки (в плане если не пришел пакет то заново отправить).
Стоит погуглить на тему готовых реализаций надёжных протоколов over udp и выбрать наиболее подходящий под конкретные условия. Изобрести очередной велосипед можно, но пользы от этого будет немного.
1
202 / 148 / 5
Регистрация: 14.03.2013
Сообщений: 784
12.02.2014, 08:48  [ТС] 12
Цитата Сообщение от alexey_rage Посмотреть сообщение
Если получится реализовать, расскажи пожалуйста, как сделал. Очень интересно.
Еще одна поправка, я там написал наносекунды, но по факту микросекунды. Учтите это.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2014, 08:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Узнать время задержки в GIF
В одной статье GDI+: графика нового поколения нашёл пример как вывести анимированный Gif в окно...

Изменить в функции время задержки
Не получается изменить время задержки в функции void timer(int level), если в glutTimerFunc(level,...

Время задержки между onclick и ondblclick
Ребят, подскажите пожалуйста, как прописать время задержки между onclick и ondblclick. Из памяти...

Сигнал во время задержки для AVR
Добрый вечер! У меня такая проблема. В обработчике прерываний по переполнению таймера 0...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.