crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3  
Тема закрытаНачать новую тему
> [Решено] UDP сервер для многих клиентов?, Ну а на самом деле просто быстрый сервер
Norrius
  опции профиля:
сообщение 24.8.2012, 19:55
Сообщение #21


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хорошо. Будет возможность - проверю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 25.8.2012, 11:54
Сообщение #22


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Проблема решена, действительно я идиот)

Как показало наблюдение за tcpSocket->bytesAvailable(), в буфере чтения скапливались данные, что объясняет и высокое время отклика, и его регрессию. Добавил
do { /*чтение пакетов*/ } while (!waiting && tcpSocket->bytesAvailable() > 0);

...и все работает.

Отключение алгоритма буферизации, как и сказано в документации, толком не влияет на скорость обмена. С flush() та же история, в общем, разобрался со всем (:

Спасибо за подробные разъяснения. Замечательный форум, мне уже который раз помогают разобраться в идиотских ошибках :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 26.8.2012, 14:58
Сообщение #23


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


вообще-то, это плохая техника программирования: такой постоянный опрос будет жрать проц на сто процентов. я не юзаю Qt, но подозреваю, что там есть возможность событийной работы с приходом данных, которую бы неплохо заюзать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 26.8.2012, 16:26
Сообщение #24


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ожидающие чтения данные довольно быстро исчерпываются, поэтому с условием (tcpSocket->bytesAvailable() > 0) ни о какой бесконечной загрузке ЦП речи не идет.

У меня и используется система событий. Но, как выясняется, может придти несколько пакетов данных между предыдущим чтением буфера и чтением, которое будет вызвано этими пакетами. Поэтому нужно при каждом получении readyRead() считывать действительно все данные, а не только первую порцию.

Сообщение отредактировал Norrius - 26.8.2012, 16:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.8.2012, 11:06
Сообщение #25


фрилансер
******

Группа: Участник
Сообщений: 2946
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Norrius @ 24.8.2012, 12:48) Link
Мне нужна быстрая реакция на каждый пакет. Ждать, пока сообщений по 5-10 байт наберется на два килобайта, не получится.

где у меня про 5-10 байт ? Я говорю - слать пакетами по 2 кБ (не больше. Меньше - пожалуйста).

Насчёт сжирания проца поллингом: вычитывать данные нужно тогда, когда есть что-то новое. Если нет, делать паузу в, скажем, 1 мс. Я делал такую вещь, прекрасно работает (в отдельном потоке)

Сообщение отредактировал Алексей1153 - 27.8.2012, 11:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.12.2025, 14:56